home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 2 / Amiga Tools 2.iso / tex / macros / source / contrib / supported / feynmf / feynmf.dtx (.txt) < prev    next >
LaTeX Document  |  1995-03-15  |  145KB  |  4,002 lines

  1. % \iffalse % feynmf.dtx - Feynman diagrams with METAFONT for LaTeX(2e)
  2. % Copyright (C) 1989, 1990, 1992-1995 by Thorsten.Ohl@Physik.TH-Darmstadt.de
  3. % /home/sources/ohl/tex/thotex/feynmf/feynmf.dtx,v 1.10 1995/02/18 16:42:18 ohl Exp
  4. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5. % Feynmf is free software; you can redistribute it and/or modify it
  6. % under the terms of the GNU General Public License as published by 
  7. % the Free Software Foundation; either version 2, or (at your option)
  8. % any later version.
  9. % Feynmf is distributed in the hope that it will be useful, but
  10. % WITHOUT ANY WARRANTY; without even the implied warranty of
  11. % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  12. % GNU General Public License for more details.
  13. % You should have received a copy of the GNU General Public License
  14. % along with this program; if not, write to the Free Software
  15. % Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  17. % \fi
  18. %% \CheckSum{553}
  19. %% \CharacterTable
  20. %%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
  21. %%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
  22. %%   Digits        \0\1\2\3\4\5\6\7\8\9
  23. %%   Exclamation   \!     Double quote  \"     Hash (number) \#
  24. %%   Dollar        \$     Percent       \%     Ampersand     \&
  25. %%   Acute accent  \'     Left paren    \(     Right paren   \)
  26. %%   Asterisk      \*     Plus          \+     Comma         \,
  27. %%   Minus         \-     Point         \.     Solidus       \/
  28. %%   Colon         \:     Semicolon     \;     Less than     \<
  29. %%   Equals        \=     Greater than  \>     Question mark \?
  30. %%   Commercial at \@     Left bracket  \[     Backslash     \\
  31. %%   Right bracket \]     Circumflex    \^     Underscore    \_
  32. %%   Grave accent  \`     Left brace    \{     Vertical bar  \|
  33. %%   Right brace   \}     Tilde         \~}
  34. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  35. % \MakeShortVerb{\|}
  36. % \title{%
  37. %   \FMF: \\
  38. %   Drawing Feynman Diagrams \\
  39. %   with \LaTeX{} and \MF}
  40. % \author{%
  41. %   Thorsten Ohl\thanks{e-mail:
  42. %     {\tt Thorsten.Ohl@Physik.TH-Darmstadt.de}}\\
  43. %   \hfil \\
  44. %   Technische Hochschule Darmstadt \\
  45. %   Schlo\ss gartenstr. 9 \\
  46. %   D-64289 Darmstadt \\
  47. %   Germany}
  48. % \maketitle
  49. % \begin{abstract}
  50. %   \FMF{} is a \LaTeX{} package for easy drawing of professional
  51. %   quality Feynman diagrams with \MF.  \FMF{} lays out most
  52. %   diagrams satisfactorily from the structure of the graph without
  53. %   any need for manual intervention.  Nevertheless all the power of
  54. %   \MF{} is available for the most obscure cases.
  55. % \end{abstract}
  56. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  57. % \section*{Copying}
  58. % \FMF{} is free software; you can redistribute it and/or modify it
  59. % under the terms of the GNU General Public License as published by 
  60. % the Free Software Foundation; either version 2, or (at your option)
  61. % any later version.
  62. % \FMF{} is distributed in the hope that it will be useful, but
  63. % \emph{without any warranty}; without even the implied warranty of
  64. % \emph{merchantability} or \emph{fitness for a particular purpose}.
  65. % See the GNU General Public License for more details.
  66. % You should have received a copy of the GNU General Public License
  67. % along with this program; if not, write to the Free Software
  68. % Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  69. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  70. % \tableofcontents
  71. % \unitlength=1mm
  72. % \begin{fmffile}{fmfsampl}
  73. % \def\bottomfraction{0}
  74. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  75. % \section{Introduction}
  76. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  77. % \subsection{Purpose and scope}
  78. % In recent years, \TeX\footnote{\TeX{} is a trademark of the American
  79. %   Mathematical Society.}~\cite{TeX}
  80. % and \LaTeX\footnote{\LaTeX{} might be a trademark of Addison Wesley
  81. %   Publishing Company.}~\cite{LaTeX}
  82. % have revolutionized the way
  83. % we share information in theoretical physics (and other areas).  Not
  84. % only does \TeX{} provide typographical capabilities, which transcend
  85. % those of commercial ``wordprocessors'' substantially, \TeX{} documents
  86. % are also completely portable.  Since implementations are available
  87. % on essentially all computers in use in the community, documents can
  88. % be shared without the usual restrictions of proprietary data
  89. % formats.  This has enabled us to collaborate on papers with
  90. % colleagues on the other side of the globe, to replace the mailing of
  91. % hard copy preprints by electronic transmission and to submit these
  92. % papers electronically to the publisher.
  93. % This portability comes with a price, though.  \TeX{} (and \LaTeX)
  94. % do not address the issue of graphical information, apart from the
  95. % rudimentary (but very useful) capabilities of the \LaTeX{} |picture|
  96. % environment and similar
  97. % packages~\cite{LaTeX-Companion}, which provide line drawings like
  98. % the one in figure~\ref{fig:flow}.  As an de facto standard for the
  99. % inclusion of more complex graphics has emerged the inclusion of
  100. % PostScript~\footnote{PostScript is a trademark of Adobe Systems
  101. %   Inc.} 
  102. % files.  The complete document can then
  103. % be printed on any PostScript device.
  104. % Still there are areas, where complementary approaches seem worth
  105. % pursuing.  In particular this is the case, if the graphical
  106. % information is highly formalized, like the case at hand.  Feynman
  107. % diagrams are specified by their topology and the type of particles
  108. % connecting the vertices.  Thus a given diagram can be reproduced
  109. % from a very concise specification, if the software is able to choose
  110. % a reasonable layout (semi-)automatically.
  111. % \MF\footnote{\MF{} is a trademark of Addison Wesley Publishing
  112. %   Company.}~\cite{MF}
  113. % and \MP\footnote{John Hobby's \MP{} is a modified version of \MF{}
  114. %   which generates (encapsulated) PostScript output.  \MP{} can be
  115. %   build trivially on top of the \texttt{web2c} version of \TeX{} and
  116. %   \MF{} for UNIX.  Ports to other systems should be
  117. %   simple.}~\cite{MetaPost}
  118. % appear to be the perfect tool for such a purpose, since
  119. % \begin{enumerate}
  120. %   \item{} \MF{} is part of any (reasonable) \TeX{} installation, thus
  121. %     available to all potential users,
  122. %   \item{} both have very powerful graphics primitivs, which allow high
  123. %     quality output, and
  124. %   \item{} both have builtin linear algebra, which allows us to choose a
  125. %     layout automatically.
  126. % \end{enumerate}
  127. % Still, providing at least the basic interface in \LaTeX{} macros
  128. % seems appropriate for boosting the acceptance among the less
  129. % technically oriented parts of the audience. Thus
  130. % \FMF\footnote{\FMF{} is not a trademark of anybody.}
  131. % was conceived.
  132. % \FMF{} supports \MF{} as well as \MP{} (under the names
  133. % \texttt{feynmp.sty} and \texttt{feynmp.mp}).
  134. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  135. % \subsection{Relation to similar packages}
  136. % Before we start, a couple of words about some complementary packages
  137. % on the market are in order.  First of all: I failed to do my
  138. % homework and didn't try hard enough to find~\cite{hoenig} in a
  139. % library.  I'm sure that in there is a smarter way of returning
  140. % information from \MF{} to \TeX{}.  Those who don't know the
  141. % literature are doomed to reinvent the wheel.  But this isn't a
  142. % scholarly work and reinventing the wheel was \emph{fun!}
  143. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  144. % \subsubsection{Feynman}
  145. % Micheal Levine's |feynman| package~\cite{levine} is
  146. % implemented on top of the standard \LaTeX{} |picture|
  147. % environment~\cite{LaTeX}.  This makes it completely portable (no
  148. % need for a correct \MF{} installation), but it requires manual
  149. % layout and the graphics output is (though very useful) less than
  150. % perfect.
  151. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  152. % \subsubsection{Axodraw}
  153. % Jos Vermaseren's |axodraw| package~\cite{axodraw} uses
  154. % |\special|s to access PostScript primitives for drawing diagrams.
  155. % This approach is inherently not portable (though the ubiquity of
  156. % PostScript printers makes this a minor point) but at least as
  157. % flexible as the present one.  It still requires manual layout,
  158. % though.
  159. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  160. % \subsubsection{Mfpic}
  161. % Last, but not least, I have to mention  Thomas Leathrum's
  162. % |mfpic|~\cite{mfpic}, which was the main inspiration for moving
  163. % \FMF's user interface from \MF{} to \TeX.  It might not have been
  164. % unreasonable to design and implement \FMF{} as a package on top of
  165. % |mfpic|\footnote{In fact a change in this direction would be rather
  166. %   easy.},
  167. % But closer inspection shows that \FMF{} and |mfpic| are fairly
  168. % orthogonal.  |mfpic| is ideally suited for handling simple graphical
  169. % building blocks in formally unconstrained contexts, a task which will
  170. % be accomplished preferably by direct manual placement of objects.
  171. % \FMF{} on the other hand works in the highly formal context of
  172. % Feynman diagrams (or any other labeled graphs for that matter),
  173. % which can be draw automatically from a \emph{specification}.
  174. % It will of course be tempting to add more features from |mfpic|'s
  175. % realm to \FMF{} in the future, but I will try to be conservative in
  176. % that respect.
  177. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  178. % \subsection{Historical note}
  179. % This code has a rather long history\footnote{Which is a partial
  180. % explanation, if not excuse, for its slightly incoherent structure.}.
  181. % Most of the sections~\ref{sec:mf-basics}, \ref{sec:pictures},
  182. % \ref{sec:shading}, and~\ref{sec:drawing} started in 1989 as
  183. % |feynman.mf|, a library of \MF{} macros for drawing Feynman
  184. % diagrams in my thesis.  The layout had to be chossen completely
  185. % manually, which required a long edit-process-preview cycle and made
  186. % |feynman.mf| awkward to use.
  187. % Nevertheless, it survived for five years without major
  188. % modifications, only slight enhancements had been made.  Early in
  189. % 1994, I became aware of Thomas Leathrum's |mfpic|~\cite{mfpic}.
  190. % This inspired me to shift the user interface from \MF{} to
  191. % \LaTeX, because this allows a smoother blending of the \LaTeX{}
  192. % |picture| environment with \FMF{}.  While doing this and after
  193. % having been taught by Tim Stelzer's and Bill Long's
  194. % \texttt{MADGRAPH}~\cite{madgraph} that minimizing the length of the
  195. % graph gives surprisingly good results for tree graphs\footnote{I had
  196. % thought about this earlier myself, but foolishly discarded the idea.
  197. % I didn't expect such a ``too simple'' method to give esthetically
  198. % pleasing results for loop graphs, which were my main concern.}, I
  199. % added the graph manipulation code in section~\ref{sec:graphs}.
  200. % And, of course, \FMF{} is biased towards those kinds of graphs that
  201. % my students, my colleagues and myself have to draw most often.
  202. % Comments for improvements from other areas of physics are welcome.
  203. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  204. % \subsection{Projects}
  205. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  206. % \subsubsection{Documented \MF{} Interface}
  207. % In a future version, \FMF{} will have a more convenient and
  208. % supported set of macros at the \MF{} level, including more general
  209. % drawing primitives.
  210. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  211. % \subsubsection{Less Formal Graphs}
  212. % In addition to the well defined Feynman graphs of perturbation
  213. % theory there are also less formal and more illustrative graphs in
  214. % use. For example the ``quark diagrams'' familiar from papers on
  215. % hadronic weak decays involve curved lines illustrating the formation
  216. % of bound states, etc. Future versions of \FMF{} will provide better
  217. % support for such graphs, without the need for raw \MF{} coding.
  218. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  219. % \subsubsection{Virtual Graphs}
  220. % \label{sec:virtual-pictures}
  221. % In a future version, \FMF{} will be able to draw ``virtual''
  222. % graphs, i.e.~graphs which are larger than the current limit enforced
  223. % by numeric overflow at higher resolutions.  This can be implemented
  224. % by calculating the layout of a miniature graph and afterwards
  225. % distributing the full graph among several \MF{} characters.
  226. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  227. % \subsection{Conclusion}
  228. % It goes without saying that \FMF{} is not perfect.  There are
  229. % cases where using a graphical drawing tool with a mouse will give
  230. % more pleasing results in less time.  But in most cases, \FMF{}
  231. % will give satisfactory results without any fine tuning.  These will
  232. % be reproducible and independent from the computer it is running on.
  233. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  234. % \section{Usage}
  235. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  236. % \subsection{Invocation}
  237. % Instructing \LaTeX{} to use \FMF{} is as simple as\footnote{As
  238. %   given, this applies to \LaTeX.  But the installation file
  239. %   \texttt{feynmf209.ins} allows to generate special versions 
  240. %   \texttt{feynmf209.sty} and \texttt{feynmp209.sty} which are
  241. %   compatible with the obsolete \LaTeX{} version 2.09.  These files
  242. %   are to be used as documentstyle options.}
  243. % \begin{verbatim}
  244. %   \usepackage{feynmf}
  245. % \end{verbatim}
  246. % and calling \MF{} should not be harder as
  247. % \begin{verbatim}
  248. %   mf '\mode:=localmode; input foobar'
  249. % \end{verbatim}
  250. % where |foobar| is the name of your \MF{} output file and |localmode|
  251. % is your local printer (e.g.~|laserjet|).
  252. % The hard part usually lies in instructing \TeX{} and your favorite
  253. % |dvi|-driver how to find the generated |tfm| and |gf| (resp.~|pk|)
  254. % files.  This is highly system dependent and can be trivial (as in
  255. % the standard UNIX\footnote{UNIX was a trademark of UNIX Systems
  256. %   Laboratory, but is rumored to have been donored to X/Open.}
  257. % \TeX{} installations) or almost impossible (as
  258. % under MVS).  Please consult your local guide or local ``\TeX{}
  259. % Wizards'' on this point.
  260. % If you have \MP, then you can use it by placing
  261. % \begin{verbatim}
  262. %   \usepackage[dvips]{feynmp}
  263. % \end{verbatim}
  264. % in your \LaTeX{} source.  Here |dvips| is an option for the
  265. % \LaTeX{} |egraphics| package which is used for including the
  266. % generated PostScript files.  It should be replaced by your local
  267. % supported |dvi| driver.  Calling \MP{} is usually even simpler
  268. % \begin{verbatim}
  269. %   mp foobar
  270. % \end{verbatim}
  271. % since there is no mode to be picked.
  272. % Please keep in mind that \FMF{} has been developed for \LaTeXe{} and
  273. % the \LaTeX~2.09 compatibility version will always be a retrofitted
  274. % hack.  I will accept bug reports for the 2.09 version, but I urge
  275. % everybody to move to \LaTeX2e, which is the one and onloy supported
  276. % \LaTeX{} right now.
  277. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  278. % \begin{figure}
  279. %   \begin{center}
  280. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  281. % \setlength{\unitlength}{0.012500in}%
  282. % \begingroup\makeatletter\ifx\SetFigFont\undefined
  283. % \def\x#1#2#3#4#5#6#7\relax{\def\x{#1#2#3#4#5#6}}%
  284. % \expandafter\x\fmtname xxxxxx\relax \def\y{splain}%
  285. % \ifx\x\y   % LaTeX or SliTeX?
  286. % \gdef\SetFigFont#1#2#3{%
  287. %   \ifnum #1<17\tiny\else \ifnum #1<20\small\else
  288. %   \ifnum #1<24\normalsize\else \ifnum #1<29\large\else
  289. %   \ifnum #1<34\Large\else \ifnum #1<41\LARGE\else
  290. %      \huge\fi\fi\fi\fi\fi\fi
  291. %   \csname #3\endcsname}%
  292. % \else
  293. % \gdef\SetFigFont#1#2#3{\begingroup
  294. %   \count@#1\relax \ifnum 25<\count@\count@25\fi
  295. %   \def\x{\endgroup\@setsize\SetFigFont{#2pt}}%
  296. %   \expandafter\x
  297. %     \csname \romannumeral\the\count@ pt\expandafter\endcsname
  298. %     \csname @\romannumeral\the\count@ pt\endcsname
  299. %   \csname #3\endcsname}%
  300. % \fi
  301. % \fi\endgroup
  302. % \begin{picture}(377,400)(3,420)
  303. % \thinlines
  304. % \put( 40,740){\framebox(80,80){}}
  305. % \put( 55,795){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{tt}foo.tex}}}
  306. % \put(280,760){\framebox(60,40){}}
  307. % \put(295,780){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{tt}fd.mf}}}
  308. % \put(160,680){\framebox(60,40){}}
  309. % \put(170,705){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{tt}fd.log}}}
  310. % \put(320,640){\framebox(60,40){}}
  311. % \put(323,664){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{tt}fd.300gf}}}
  312. % \put(100,600){\framebox(60,40){}}
  313. % \put(110,620){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{tt}fd.t1}}}
  314. % \put(180,600){\framebox(60,40){}}
  315. % \put(185,622){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{tt}fd.t2}}}
  316. % \put(260,560){\framebox(60,40){}}
  317. % \put(270,585){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{tt}fd.tfm}}}
  318. % \put( 40,420){\framebox(80,80){}}
  319. % \put( 50,485){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{tt}foo.dvi}}}
  320. % \put(290,463){\oval(130,74)}
  321. % \put(260,470){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{tt}lpr}}}
  322. % \thicklines
  323. % \put(295,760){\vector(-3,-1){106.500}}
  324. % \put(325,760){\vector( 1,-3){ 26.500}}
  325. % \put(310,760){\vector(-1,-4){ 39.118}}
  326. % \multiput(120,780)(11.85185,0.00000){14}{\line( 1, 0){  5.926}}
  327. % \put(280,780){\vector( 1, 0){0}}
  328. % \put( 60,500){\vector( 0,-1){0}}
  329. % \multiput( 60,740)(0.00000,-4.52830){53}{\makebox(0.4444,0.6667){\SetFigFont{10}{12}{rm}.}}
  330. % \put( 80,500){\vector(-1,-2){0}}
  331. % \multiput(130,600)(-2.00000,-4.00000){25}{\makebox(0.4444,0.6667){\SetFigFont{10}{12}{rm}.}}
  332. % \put(120,480){\vector(-2,-1){0}}
  333. % \multiput(280,560)(-4.00000,-2.00000){40}{\makebox(0.4444,0.6667){\SetFigFont{10}{12}{rm}.}}
  334. % \put(210,640){\vector( 1,-4){0}}
  335. % \multiput(200,680)(1.11764,-4.47058){9}{\makebox(0.4444,0.6667){\SetFigFont{10}{12}{rm}.}}
  336. % \put(129,642){\vector(-4,-3){0}}
  337. % \multiput(180,680)(-3.65714,-2.74286){14}{\makebox(0.4444,0.6667){\SetFigFont{10}{12}{rm}.}}
  338. % \thinlines
  339. % \put(120,460){\vector( 1, 0){105}}
  340. % \put(300,560){\vector( 0,-1){ 60}}
  341. % \put(350,640){\vector( 0,-1){145}}
  342. % \thicklines
  343. % \put(105,494){\vector(-1,-1){0}}
  344. % \multiput(211,600)(-3.19697,-3.19697){33}{\makebox(0.4444,0.6667){\SetFigFont{10}{12}{rm}.}}
  345. % \put(160,790){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{rm}\LaTeX{} \#1}}}
  346. % \put(360,535){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{rm}dvi2xxx}}}
  347. % \put(350,725){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{rm}\MF}}}
  348. % \put(  3,663){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{rm}\LaTeX{} \#2}}}
  349. % \end{picture}
  350. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  351. %   \end{center}
  352. %   \caption{Flow of information in a \FMF{} application:  The
  353. %      first \LaTeX{} pass is shown with a dashed line.  The \MF{}
  354. %      pass is shown with the full lines and the second \LaTeX{} pass
  355. %      with dotted lines.  The final dvi translation step is shown with
  356. %      thin lines.}
  357. %   \label{fig:flow}
  358. % \end{figure}
  359. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  360. % The flow of information depicted in figure~\ref{fig:flow} looks much
  361. % more complicated than it is.  The important feature is that there a
  362. % two sets of files which can be used to distribute a document:
  363. % \begin{enumerate}
  364. %   \item{} Iff the recipient has a working \MF{} installation
  365. %     (which shouldn't be a problem, except for some impoverished
  366. %     commercial implementations), the document can be typset from the
  367. %     \LaTeX{} source \emph{alone}, by running \LaTeX{}, \MF{}
  368. %     and \LaTeX{} again (the latter step might have to be repeated to
  369. %     get cross references right).
  370. %   \item{} Another possibility (which doesn't require \MF{} on
  371. %     the recipient's side), is to distribute the \LaTeX{} source, the
  372. %     |tfm| and |gf| files (or |pk| files respectively) along with the
  373. %     label files with extension |t|$n$ (where $n$ as an integer).
  374. %     Distributing the \MF{} |log| files is a possible alternative
  375. %     for the latter, but discouraged, because these are prone to be
  376. %     erased accidentally.
  377. % \end{enumerate}
  378. % I should add one caveat here: some |dvi| file previewers
  379. % (e.g.~xdvi(1) under UNIX) do \emph{not} reread font information if
  380. % the |tfm| or |pk| files have changed, even though they reread the
  381. % |dvi| file if it has changed.  Thus you have to restart such
  382. % previewers if you have made changes in diagrams to see these changes
  383. % on the screen.
  384. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  385. % \begin{figure}
  386. %   \begin{center}
  387. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  388. % \setlength{\unitlength}{0.012500in}%
  389. % \begingroup\makeatletter\ifx\SetFigFont\undefined
  390. % \def\x#1#2#3#4#5#6#7\relax{\def\x{#1#2#3#4#5#6}}%
  391. % \expandafter\x\fmtname xxxxxx\relax \def\y{splain}%
  392. % \ifx\x\y   % LaTeX or SliTeX?
  393. % \gdef\SetFigFont#1#2#3{%
  394. %   \ifnum #1<17\tiny\else \ifnum #1<20\small\else
  395. %   \ifnum #1<24\normalsize\else \ifnum #1<29\large\else
  396. %   \ifnum #1<34\Large\else \ifnum #1<41\LARGE\else
  397. %      \huge\fi\fi\fi\fi\fi\fi
  398. %   \csname #3\endcsname}%
  399. % \else
  400. % \gdef\SetFigFont#1#2#3{\begingroup
  401. %   \count@#1\relax \ifnum 25<\count@\count@25\fi
  402. %   \def\x{\endgroup\@setsize\SetFigFont{#2pt}}%
  403. %   \expandafter\x
  404. %     \csname \romannumeral\the\count@ pt\expandafter\endcsname
  405. %     \csname @\romannumeral\the\count@ pt\endcsname
  406. %   \csname #3\endcsname}%
  407. % \fi
  408. % \fi\endgroup
  409. % \begin{picture}(357,400)(3,420)
  410. % \thinlines
  411. % \put( 40,740){\framebox(80,80){}}
  412. % \put( 55,795){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{tt}foo.tex}}}
  413. % \put( 40,420){\framebox(80,80){}}
  414. % \put( 50,485){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{tt}foo.dvi}}}
  415. % \put(290,463){\oval(130,74)}
  416. % \put(260,470){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{tt}lpr}}}
  417. % \put(100,640){\framebox(60,40){}}
  418. % \put(110,660){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{tt}fd.t1}}}
  419. % \put(180,640){\framebox(60,40){}}
  420. % \put(185,662){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{tt}fd.t2}}}
  421. % \put(220,580){\framebox(60,40){}}
  422. % \put(230,605){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{tt}fd.1}}}
  423. % \put(300,580){\framebox(60,40){}}
  424. % \put(303,604){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{tt}fd.2}}}
  425. % \put(280,760){\framebox(60,40){}}
  426. % \put(295,780){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{tt}fd.mp}}}
  427. % \thicklines
  428. % \put(325,760){\vector( 0,-1){140}}
  429. % \put(310,760){\vector(-1,-2){ 69}}
  430. % \multiput(120,780)(11.85185,0.00000){14}{\line( 1, 0){  5.926}}
  431. % \put(280,780){\vector( 1, 0){0}}
  432. % \put( 60,500){\vector( 0,-1){0}}
  433. % \multiput( 60,740)(0.00000,-4.52830){53}{\makebox(0.4444,0.6667){\SetFigFont{10}{12}{rm}.}}
  434. % \put( 83,499){\vector(-1,-3){0}}
  435. % \multiput(130,640)(-1.42424,-4.27273){33}{\makebox(0.4444,0.6667){\SetFigFont{10}{12}{rm}.}}
  436. % \put(115,486){\vector(-4,-3){0}}
  437. % \multiput(240,580)(-3.56571,-2.67429){35}{\makebox(0.4444,0.6667){\SetFigFont{10}{12}{rm}.}}
  438. % \thinlines
  439. % \put(120,460){\vector( 1, 0){105}}
  440. % \put(260,580){\vector( 1,-2){ 40}}
  441. % \thicklines
  442. % \put(104,497){\vector(-3,-4){0}}
  443. % \multiput(211,640)(-2.67900,-3.57200){40}{\makebox(0.4444,0.6667){\SetFigFont{10}{12}{rm}.}}
  444. % \thinlines
  445. % \put(345,580){\vector(-1,-2){ 40}}
  446. % \thicklines
  447. % \put(295,760){\vector(-1,-1){ 82}}
  448. % \put(295,760){\vector(-2,-1){164}}
  449. % \put(120,480){\vector(-2,-1){0}}
  450. % \multiput(320,580)(-4.00000,-2.00000){50}{\makebox(0.4444,0.6667){\SetFigFont{10}{12}{rm}.}}
  451. % \put(160,790){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{rm}\LaTeX \#1}}}
  452. % \put(  3,663){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{rm}\LaTeX \#2}}}
  453. % \put(345,520){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{rm}dvips}}}
  454. % \put(340,685){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{rm}\MP}}}
  455. % \end{picture}
  456. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  457. %   \end{center}
  458. %   \caption{Flow of information in a \FMF{} application if \MP{} is
  459. %      used instead of \MF.}
  460. %   \label{fig:flowp}
  461. % \end{figure}
  462. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  463. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  464. % \subsection{Basic usage}
  465. % The basic features of \FMF{} are (or rather ``should be'')
  466. % available through the \LaTeX{} interface.  Not knowledge of
  467. % \MF{} is necessary.
  468. % \DescribeEnv{fmffile}
  469. % Upto 255 characters can be placed into one \MF{} file, they are
  470. % enclosed in a single |fmffile| environment.  The environment
  471. % takes the filename as argument.  Currently \FMF{} does \emph{not}
  472. % check that the 255 character limit per file is not overrun.
  473. % \begin{verbatim}
  474. %   \begin{fmffile}{foobar}
  475. %     ...
  476. %   \end{fmffile}
  477. % \end{verbatim}
  478. % Note that the filename for the \MF{} file given in the argument of
  479. % the |fmffile| environment \emph{must not} be identical to the
  480. % \LaTeX{} source file name, because the \MF{} |.log| would be
  481. % overwritten and \LaTeX{} can no longer access the information in
  482. % this |.log| file.
  483. % \DescribeEnv{fmfchar}
  484. % Draw one character and place it here.  Arguments are
  485. % |(|\meta{width}|,|\meta{height}|)| as in:
  486. % \begin{verbatim}
  487. %   \begin{fmfchar}(40,25)
  488. %     ...
  489. %   \end{fmfchar}
  490. % \end{verbatim}
  491. % This environment does \emph{not} support labels, use |fmfchar*| if
  492. % your diagrams contains labels.
  493. % \DescribeEnv{fmfchar*}
  494. % Same as |fmfchar|, but enclosed in a |picture| environment of the
  495. % same size and supporting \LaTeX{} labels.
  496. % \begin{verbatim}
  497. %   \begin{fmfchar*}(40,25)
  498. %     ...
  499. %   \end{fmfchar*}
  500. % \end{verbatim}
  501. % \DescribeMacro{\fmfleft}
  502. % \DescribeMacro{\fmfright}
  503. % \DescribeMacro{\fmfbottom}
  504. % \DescribeMacro{\fmftop}
  505. % \DescribeMacro{\fmfsurround}
  506. % Positioning of
  507. % external vertices has to done explicitely.  The technical reason is
  508. % that they would otherwise collapse with their neighbors, but
  509. % practical reasons also suggest to give the user full control here.
  510. % |\fmfleft{|\meta{v1}$[$|,|\ldots$]$|}| places the
  511. % vertices in the comma separated list \meta{v1},\ldots
  512. % equidistantly on a smooth path on the left side of the diagram.
  513. % |\fmfright{|\meta{v1}$[$|,|\ldots$]$|}| does the same
  514. % thing on the right.  Similarly |\fmfbottom| and |\fmftop|, while
  515. % |\fmfsurround{|\meta{v1}$[$|,|\ldots$]$|}|
  516. % places its arguments on smooth path
  517. % surrounding the diagram:
  518. % \def\gallerylabels{%
  519. %   \fmfdotn{v}{4}%
  520. %   \fmflabel{$v_1$}{v1}%
  521. %   \fmflabel{$v_2$}{v2}%
  522. %   \fmflabel{$v_3$}{v3}%
  523. %   \fmflabel{$v_4$}{v4}}
  524. % \begin{center}
  525. %   \label{p:galleries}
  526. %   \hfil\\
  527. %   \fbox{\begin{fmfchar*}(15,12)
  528. %     \fmfpen{thick}%
  529. %     \fmfbottomn{v}{4}\gallerylabels
  530. %     \fmfcmd{draw (bottom_gallery);}
  531. %   \end{fmfchar*}}\qquad
  532. %   \fbox{\begin{fmfchar*}(15,12)
  533. %     \fmfpen{thick}%
  534. %     \fmfleftn{v}{4}\gallerylabels
  535. %     \fmfcmd{draw (left_gallery);}
  536. %   \end{fmfchar*}}\qquad
  537. %   \fbox{\begin{fmfchar*}(15,12)
  538. %     \fmfpen{thick}%
  539. %     \fmfsurroundn{v}{7}\fmfdotn{v}{7}%
  540. %     \fmflabel{$v_1$}{v1}\fmflabel{$v_2$}{v2}%
  541. %     \fmflabel{$v_3$}{v3}\fmflabel{$v_4$}{v4}%
  542. %     \fmflabel{$v_5$}{v5}\fmflabel{$v_6$}{v6}%
  543. %     \fmflabel{$v_7$}{v7}%
  544. %     \fmfcmd{draw (surround_gallery);}
  545. %   \end{fmfchar*}}\qquad
  546. %   \fbox{\begin{fmfchar*}(15,12)
  547. %     \fmfpen{thick}%
  548. %     \fmftopn{v}{4}\gallerylabels
  549. %     \fmfcmd{draw (top_gallery);}
  550. %   \end{fmfchar*}}\qquad
  551. %   \fbox{\begin{fmfchar*}(15,12)
  552. %     \fmfpen{thick}%
  553. %     \fmfrightn{v}{4}\gallerylabels
  554. %     \fmfcmd{draw (right_gallery);}
  555. %   \end{fmfchar*}}\\
  556. %   \hfil
  557. % \end{center}
  558. % \DescribeMacro{\fmfpen}
  559. % Pick up a pen of the specified size.  |\fmfpen{|\meta{weight}|}|
  560. % is used for changing the weight (i.e.~thickness) of the lines.
  561. % Predefined sizes are |thin| and |thick|.
  562. % \def\linesample#1{%
  563. %   \begin{fmfchar}(30,4)
  564. %     \fmfleft{i1,i2}
  565. %     \fmfright{o1,o2}
  566. %     \fmf{#1}{i1,o1}
  567. %   \end{fmfchar}}
  568. % \begin{table}
  569. %   \begin{tabular}{lcll}
  570. %     Name               & Example                       & Parameters  & Aliases  \\\hline
  571. %     |curly|            & \linesample{curly}            & |curly_len| & |gluon|  \\
  572. %     |dbl_curly|        & \linesample{dbl_curly}        & |curly_len| & \\
  573. %     |dashes|           & \linesample{dashes}           & |dash_len|  & \\
  574. %     |dashes_arrow|     & \linesample{dashes_arrow}     & |dash_len|  & |scalar| \\
  575. %     |dbl_dashes|       & \linesample{dbl_dashes}       & |dash_len|  & \\
  576. %     |dbl_dashes_arrow| & \linesample{dbl_dashes_arrow} & |dash_len|  & \\
  577. %     |dots|             & \linesample{dots}             & |dot_len|   & \\
  578. %     |dots_arrow|       & \linesample{dots_arrow}       & |dot_len|   & |ghost|  \\
  579. %     |dbl_dots|         & \linesample{dbl_dots}         & |dot_len|   & \\
  580. %     |dbl_dots_arrow|   & \linesample{dbl_dots_arrow}   & |dot_len|   & \\
  581. %     |phantom|          & \linesample{phantom}          &             & \\
  582. %     |phantom_arrow|    & \linesample{phantom_arrow}    &             & \\
  583. %     |plain|            & \linesample{plain}            &             & |vanilla|\\
  584. %     |plain_arrow|      & \linesample{plain_arrow}      &             & |fermion|,
  585. %                                                                        |electron|,
  586. %                                                                        |quark|  \\
  587. %     |dbl_plain|        & \linesample{dbl_plain}        &             & |double| \\
  588. %     |dbl_plain_arrow|  & \linesample{dbl_plain_arrow}  &             & |double_arrow|,
  589. %                                                                        |heavy|  \\
  590. %     |wiggly|           & \linesample{wiggly}           & |wiggly_len|& |boson|,
  591. %                                                                        |photon| \\
  592. %     |dbl_wiggly|       & \linesample{dbl_wiggly}       & |wiggly_len|&
  593. %   \end{tabular}
  594. %   \caption{Available line styles}
  595. %   \label{tab:line-styles}
  596. % \end{table}
  597. % \begin{table}
  598. %   \begin{tabular}{lp{60mm}}
  599. %     Name         & Explanation \\\hline
  600. %     |tension|    & draw a tighter ($>1$) or more loos ($<1$) arc \\
  601. %     |left|       & draw on a halfcircle on the left \\
  602. %     |right|      & draw on a halfcircle on the right \\
  603. %     |straight|   & draw on a straight line \\
  604. %     |label|      & \TeX{} text for labeling the arc \\
  605. %     |label.side| & force placement of the label on the |left| or
  606. %                   |right| \\
  607. %     |label.dist| & place label at a distance |dist| \\
  608. %     |label.pos|  & relative position of the label
  609. %                    (not implemented yet!) \\
  610. %     |decoration.shape|  & shape of decoration
  611. %                           (not implemented yet!) \\
  612. %     |decoration.size|   & size of decoration
  613. %                           (not implemented yet!) \\
  614. %     |decoration.pos|    & relative position of decoration
  615. %                           (not implemented yet!) \\
  616. %     |decoration.filled| & fill, shade or hatch decoration
  617. %                           (not implemented yet!) \\
  618. %     |decoration.angle|  & rotate decoration relative to default
  619. %                           (not implemented yet!)
  620. %   \end{tabular}
  621. %   \caption{Available line options}
  622. %   \label{tab:line-options}
  623. % \end{table}
  624. % \DescribeMacro{\fmf}
  625. % This is the the most frequently used macro in \FMF{} applications.
  626. % |\fmf{|\meta{style}\allowbreak
  627. %   $[$|,|\meta{opt}\allowbreak
  628. %   $[$|=|\meta{val}$]$|,|\ldots$]$|}{|\meta{v1}|,|\meta{v2}\allowbreak
  629. %   $[$|,|\ldots$]$|}|
  630. % connects the vertices \textit{v1,v2,\ldots} with a line of style
  631. % \meta{style}, using a set of options \meta{opt} with (optional)
  632. % value \meta{val}.  If a vertex is not
  633. % known yet, it is added to the diagram.  Note that the actual drawing
  634. % is not done immediately, because the positions can only be
  635. % calculated when \emph{all} vertices are known. The currently
  636. % available styles are collected in table~\ref{tab:line-styles}.  Most
  637. % names should be self explanatory
  638. % and are not discussed further.
  639. % The |dashes|, |dots|, |phantom| and |plain| styles can optionally be
  640. % decorated with an arrow as shown above.  All styles, including
  641. % |curly| and |wiggly|, can be doubled.  But arrows are not available
  642. % for the latter two, because esthetically pleasing results can not be
  643. % expected.  The |phantom|
  644. % style is special, because it
  645. % only enters the vertices and does \emph{not} cause a line to be
  646. % drawn.  This is extremely useful for advanced layout features, as
  647. % explained below.
  648. % The supported options are collected in
  649. % table~\ref{tab:line-options}\footnote{%
  650. %   \begin{dubious}
  651. %     One particulary useful further option would be \texttt{smooth},
  652. %     allowing for several lines joined smoothly.  Early
  653. %     experimentation has shown however, that the results are not
  654. %     always what one expects and that there is a lot of room for
  655. %     abuse.
  656. %   \end{dubious}}.
  657. % Note that each of the dot separated components of the options can be
  658. % abbreviated.  For example, |l.d| is equivalent to |label.dist|.  The
  659. % result of ambiguous matches is however undefined.
  660. % \begin{table}
  661. %   \begin{tabular}{lp{60mm}}
  662. %     Name                 & Explanation \\\hline
  663. %     |label|              & \TeX{} text for labeling the vertex \\
  664. %     |label.angle|        & force placement of the label at the given
  665. %                            angle from the vertex \\
  666. %     |label.dist|         & place label at a distance |dist| \\
  667. %     |decoration.shape|   & shape of decoration \\
  668. %     |decoration.size|    & size of decoration \\
  669. %     |decoration.filled|  & fill, shade or hatch decoration \\
  670. %     |decoration.angle|   & rotate decoration
  671. %   \end{tabular}
  672. %   \caption{Available vertex options}
  673. %   \label{tab:vertex-options}
  674. % \end{table}
  675. % \DescribeMacro{\fmfv}
  676. % Declare vertices with options:
  677. % |\fmfv{|\meta{shape}$[$|=|\meta{val}$]$\allowbreak
  678. %   $[$|,|\meta{opt}\allowbreak
  679. %   $[$|=|\meta{val}$]$|,|\ldots$]$|}{|\meta{v1}\allowbreak
  680. %   $[$|,|\ldots$]$|}|
  681. % This is used for adding labels to a vertex and for specifying other
  682. % decoration.  Supported options are collected in
  683. % table~\ref{tab:vertex-options}.  Here the same abbreviation
  684. % mechanism as above is in effect.  The available |shape|s are listed
  685. % in various filling styles in table~\ref{tab:vertex-shapes}\footnote{%
  686. %   If the variable \texttt{feymfwizard} is \texttt{true} (e.g.~after
  687. %   calling the \texttt{fmfwizard} macro),
  688. %   it is also possible to specify any \MF{} expression that evaluates
  689. %   to a \texttt{path}.  Naturally, this has to used with great care,
  690. %   because strange errors can be triggered by typos!}.
  691. % \def\VertexSample#1#2{%
  692. %   \begin{fmfchar}(8,8)
  693. %     \fmfforce{(.5w,.4h)}{c}
  694. %     \fmfv{d.shape=#1,d.filled=#2}{c}
  695. %   \end{fmfchar}}
  696. % \def\VertexSamples#1{%
  697. %   \VertexSample{#1}{-.5} & \VertexSample{#1}{0}
  698. %   & \VertexSample{#1}{.5} & \VertexSample{#1}{1}}
  699. % \begin{table}
  700. %   \begin{center}
  701. %     \begin{tabular}{lcccc}
  702. %                  & |filled=-.5| & |filled=0| & |filled=.5| & |filled=1| \\
  703. %       \hline
  704. %       |circle|   & \VertexSamples{circle} \\
  705. %       |square|   & \VertexSamples{square} \\
  706. %       |triangle| & \VertexSamples{triangle} \\
  707. %       |diamond|  & \VertexSamples{diamond} \\
  708. %       |pentagon| & \VertexSamples{pentagon} \\
  709. %       |hexagon|  & \VertexSamples{hexagon} \\
  710. %       |triagram| & \VertexSamples{triagram} \\
  711. %       |tetragram|& \VertexSamples{tetragram} \\
  712. %       |pentagram|& \VertexSamples{pentagram} \\
  713. %       |hexagram| & \VertexSamples{hexagram}
  714. %     \end{tabular}
  715. %   \end{center}
  716. %   \caption{Available vertex shapes and fill styles.}
  717. %   \label{tab:vertex-shapes}
  718. % \end{table}
  719. % \DescribeMacro{\fmfblob}
  720. % Draw a blob of the specified diameter at the vertices.
  721. % |\fmfblob{|\meta{diameter}|}{|\meta{v1}\allowbreak
  722. %   $[$|,|\ldots$]$|}| is equivalent to
  723. % |\fmfv{decor.shape=circle,|\allowbreak|decor.filled=.5,|\allowbreak
  724. %   |decor.size=|\meta{diameter}\allowbreak
  725. %   |}{|\meta{v1}\allowbreak$[$|,|\ldots$]$|}|
  726. % \DescribeMacro{\fmfdot}
  727. % Draw a dot at the vertices given as arguments.
  728. % |\fmfdot{|\meta{v1}\allowbreak
  729. %   $[$|,|\ldots$]$|}| is equivalent to
  730. % |\fmfv{decor.shape=circle,|\allowbreak|decor.filled=1,|\allowbreak
  731. %   |decor.size=2thick|\allowbreak
  732. %   |}{|\meta{v1}\allowbreak$[$|,|\ldots$]$|}|
  733. % \DescribeMacro{\fmfposition}
  734. % Calculate the positions of the vertices based on the arcs which are
  735. % defined up to this point.  Usually this calculation is performed
  736. % automatically at the end of the |fmfchar| environment. Calling it
  737. % explicitely, is useful for adding arcs which should not enter the
  738. % calculation.
  739. % \DescribeMacro{\fmfforce}
  740. % |\fmfforce{|\meta{pos}|}{|\meta{v1}\allowbreak$[$|,|\ldots$]$|}|
  741. % forces the position \meta{pos} of the vertices \meta{v1}\ldots,
  742. % bypassing the automatic layout. 
  743. % \DescribeMacro{\fmfshift}
  744. % |\fmfforce{|\meta{dist}|}{|\meta{v1}\allowbreak$[$|,|\ldots$]$|}|
  745. % shifts the position of the vertices \meta{v1}\ldots{} by \meta{dist}
  746. % from the automatic layout.
  747. % \DescribeMacro{\fmffixed}
  748. % |\fmfforce{|\meta{dist}|}{|\meta{v1}\allowbreak$[$|,|\ldots$]$|}|
  749. % fixes the distance between subsequent vertices in the list
  750. % \meta{v1}\ldots{} to \meta{dist}.
  751. % This command should be used with care, because it is possible to
  752. % overconstrain the layout of the graph and the error messages will be
  753. % obscure to a novice user.
  754. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  755. % \subsection{Examples}
  756. % As an example, consider drawing a straightforward box diagram,
  757. % familier from $K$-$\bar K$, $D$-$\bar D$, and  $B$-$\bar B$ mixing.
  758. % The commands for the labels are not shown here, they are discussed
  759. % in section~\ref{sec:labels}
  760. % \vspace*{\baselineskip}
  761. % \begin{minipage}{0.6\linewidth}
  762. %   We start the diagram and pick up a thick pen:
  763. %   \begin{verbatim}
  764. %   \begin{fmfchar}(40,25)
  765. %     \fmfpen{thick}
  766. %   \end{verbatim}
  767. %   The incoming and outcoming vertices are placed on the left and
  768. %   right hand side, respectively:
  769. %   \begin{verbatim}
  770. %     \fmfleft{i1,i2}
  771. %     \fmfright{o1,o2}
  772. %   \end{verbatim}
  773. %   Now we tell \FMF{} how the arcs are connected.
  774. %   \begin{verbatim}
  775. %     \fmf{fermion}{i1,v1,v3,o1}
  776. %     \fmf{fermion}{o2,v4,v2,i2}
  777. %     \fmf{photon}{v1,v2}
  778. %     \fmf{photon}{v3,v4}
  779. %   \end{verbatim}
  780. %   Finally we tell \FMF{} to draw dots at the vertices and we're
  781. %   done.
  782. %   \begin{verbatim}
  783. %     \fmfdot{v1,v2,v3,v4}
  784. %   \end{fmfchar}
  785. %   \end{verbatim}
  786. % \end{minipage}
  787. % \hfill
  788. % \begin{minipage}{0.35\linewidth}
  789. %   \begin{center}
  790. %     \begin{fmfchar*}(40,25)
  791. %       \fmfpen{thick}
  792. %       \fmfleft{i1,i2}
  793. %       \fmflabel{$\noexpand\bar b$}{i1}
  794. %       \fmflabel{$d$}{i2}
  795. %       \fmfright{o1,o2}
  796. %       \fmflabel{$\noexpand\bar d$}{o1}
  797. %       \fmflabel{$b$}{o2}
  798. %       \fmf{fermion}{i1,v1}
  799. %       \fmf{fermion,label=$\noexpand\bar t,,\noexpand\bar c,,
  800. %                           \noexpand\bar u$,l.side=right}{v1,v3}
  801. %       \fmf{fermion}{v3,o1}
  802. %       \fmf{fermion}{o2,v4}
  803. %       \fmf{fermion,label=$t,,c,,u$,l.side=right}{v4,v2}
  804. %       \fmf{fermion}{v2,i2}
  805. %       \fmf{photon,label=$W^+$,l.side=left}{v1,v2}
  806. %       \fmf{photon,label=$W^-$,l.side=right}{v3,v4}
  807. %       \fmfdot{v1,v2,v3,v4}
  808. %     \end{fmfchar*}
  809. %   \end{center}
  810. % \end{minipage}
  811. % \label{page:simple-examples}
  812. % Here is the resonant $s$-channel contribution to $e^+e^-\to 4f$.
  813. % (From now on, we do no longer display the
  814. % |\begin{fmfchar}(40,25)|, |\fmfpen{thick}|, \ldots,
  815. % |\end{fmfchar}| surrounding all pictures.)
  816. % \vspace*{\baselineskip}
  817. % \begin{minipage}{0.6\linewidth}
  818. %   \begin{verbatim}
  819. %     \fmfleft{i1,i2}
  820. %     \fmfright{o1,o2,o3,o4}
  821. %       \fmf{fermion}{i1,v1,i2}
  822. %     \fmf{photon}{v1,v2}
  823. %     \fmfblob{.15w}{v2}
  824. %       \fmf{photon}{v2,v3}
  825. %         \fmf{fermion}{o1,v3,o2}
  826. %       \fmf{photon}{v2,v4}
  827. %         \fmf{fermion}{o4,v4,o3}
  828. %   \end{verbatim}
  829. % \end{minipage}
  830. % \hfill
  831. % \begin{minipage}{0.38\linewidth}
  832. %   \begin{center}
  833. %     \fmfframe(0,5)(5,7){%
  834. %       \begin{fmfchar*}(40,25)
  835. %         \fmfpen{thick}
  836. %         \fmfleft{i1,i2}
  837. %         \fmfright{o1,o2,o3,o4}
  838. %           \fmflabel{$e_-$}{i1}
  839. %           \fmflabel{$e_+$}{i2}
  840. %           \fmf{fermion}{i1,v1,i2}
  841. %         \fmf{photon}{v1,v2}
  842. %         \fmfblob{.15w}{v2}
  843. %           \fmf{photon}{v2,v3}
  844. %             \fmflabel{$\noexpand\mu_+$}{o1}
  845. %             \fmflabel{$\noexpand\nu_{\noexpand\mu}$}{o2}
  846. %             \fmf{fermion}{o1,v3,o2}
  847. %           \fmf{photon}{v2,v4}
  848. %             \fmflabel{$\noexpand\bar c$}{o4}
  849. %             \fmflabel{$s$}{o3}
  850. %             \fmf{fermion}{o4,v4,o3}
  851. %       \end{fmfchar*}}
  852. %   \end{center}
  853. % \end{minipage}
  854. % And the resonant $t$-channel contribution:
  855. % \vspace*{\baselineskip}
  856. % \begin{minipage}{0.6\linewidth}
  857. %   \begin{verbatim}
  858. %     \fmfleft{i1,i2}
  859. %     \fmfright{o1,o2,o3,o4}
  860. %     \fmf{fermion}{i1,v1,v2,i2}
  861. %       \fmf{photon}{v1,v3}
  862. %         \fmf{fermion}{o1,v3,o2}
  863. %       \fmf{photon}{v2,v4}
  864. %         \fmf{fermion}{o4,v4,o3}
  865. %   \end{verbatim}
  866. % \end{minipage}
  867. % \hfill
  868. % \begin{minipage}{0.38\linewidth}
  869. %   \begin{center}
  870. %     \fmfframe(0,5)(5,7){%
  871. %       \begin{fmfchar*}(40,25)
  872. %         \fmfpen{thick}
  873. %         \fmfleft{i1,i2}
  874. %         \fmfright{o1,o2,o3,o4}
  875. %         \fmflabel{$e_-$}{i1}
  876. %         \fmflabel{$e_+$}{i2}
  877. %         \fmf{fermion}{i1,v1,v2,i2}
  878. %           \fmf{photon}{v1,v3}
  879. %             \fmflabel{$\noexpand\mu_+$}{o1}
  880. %             \fmflabel{$\noexpand\nu_{\noexpand\mu}$}{o2}
  881. %             \fmf{fermion}{o1,v3,o2}
  882. %           \fmf{photon}{v2,v4}
  883. %             \fmflabel{$\noexpand\bar c$}{o4}
  884. %             \fmflabel{$s$}{o3}
  885. %             \fmf{fermion}{o4,v4,o3}
  886. %       \end{fmfchar*}}
  887. %   \end{center}
  888. % \end{minipage}
  889. % Actually, these three diagrams can be improved slightly by using
  890. % |phantom| arcs, which will be discussed in the next section.
  891. % Two point loop diagrams pose another set of problems.  We
  892. % must have a way of specifying that one or more of the lines
  893. % connecting the two vertices are \emph{not} connected by a straight
  894. % line.  The options |left|, |right| and |straight| offer the
  895. % possibility to connect two vertices by a semicircle detour, either
  896. % on the left or on the right.  Since by default all lines contribute
  897. % to the tension between two vertices, the |tension| option allows us
  898. % to reduce this tension.  The next examples shows both options in
  899. % action.  The lower fermion line is given an tension of~$1/3$ to
  900. % make is symmetrical with the upper line with consists of three parts.
  901. % The loop photon is using a detour on the right and does not
  902. % contribute any tension.
  903. % \vspace*{\baselineskip}
  904. % \begin{minipage}{0.6\linewidth}
  905. %   \begin{verbatim}
  906. %     \fmfleft{i1,i2}
  907. %     \fmfright{o1}
  908. %     \fmf{fermion,tension=1/3}{i1,v1}
  909. %     \fmf{plain}{v1,v2}
  910. %     \fmf{fermion}{v2,v3}
  911. %     \fmf{photon,right,tension=0}{v2,v3}
  912. %     \fmf{plain}{v3,i2}
  913. %     \fmf{photon}{v1,o1}
  914. %   \end{verbatim}
  915. % \end{minipage}
  916. % \hfill
  917. % \begin{minipage}{0.35\linewidth}
  918. %   \begin{center}
  919. %     \begin{fmfchar*}(40,25)
  920. %       \fmfpen{thick}
  921. %       \fmfleft{i1,i2}
  922. %       \fmflabel{$p^{\noexpand\prime}$}{i1}
  923. %       \fmflabel{$p$}{i2}
  924. %       \fmfright{o1}
  925. %       \fmflabel{$p+p^{\noexpand\prime}$}{o1}
  926. %       \fmf{fermion,tension=1/3}{i1,v1}
  927. %       \fmf{plain}{v1,v2}
  928. %       \fmf{fermion,label=$p-k$,l.side=left}{v2,v3}
  929. %       \fmf{photon,right,tension=0,label=$k$}{v2,v3}
  930. %       \fmf{plain}{v3,i2}
  931. %       \fmf{photon}{v1,o1}
  932. %     \end{fmfchar*}
  933. %   \end{center}
  934. % \end{minipage}
  935. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  936. % \subsection{Labels}
  937. % \label{sec:labels}
  938. % Let us now come back to the examples on
  939. % page~\pageref{page:simple-examples} and discuss how to add the
  940. % labels.
  941. % \DescribeMacro{\fmflabel}
  942. % The macro |\fmflabel{|\meta{label}|}{|\meta{v}|}| adds the label
  943. % \meta{label} to the vertex \meta{v}.  In the current implementation,
  944. % there can be only a single label for each vertex.  Thus earlier
  945. % calls to |\fmflabel| for the same vertex will be overwritten.
  946. % \meta{label} will be placed with the |\put| command of the \LaTeX{}
  947. % |picture| environment.  \emph{It is absolutely necessary to quote
  948. % \emph{each} \TeX{} control sequence appearing in \meta{label} with}
  949. % |\noexpand|.  \emph{Otherwise all kinds of disasters are bound to
  950. % happen, causing at the very least some obscure error messages!}
  951. % Note that the |fmfchar*| environment must be used to use labels,
  952. % they will silently disappear in |fmfchar|.
  953. % |\fmflabel| gives the user \emph{no} control on the placement of
  954. % the the label (see below for a more fine-grained control provided by
  955. % the options to the |\fmfv| macro).  The label is placed using the
  956. % following algorithm:
  957. % \begin{enumerate}
  958. %   \item{} The reference point of the box containing \meta{label} is
  959. %     placed at the distance |3thick| on the continuation of the
  960. %     straight line connecting the center of the picture with the
  961. %     vertex \meta{v}.
  962. %   \item{} The reference point of the box is chosen such that the
  963. %     contents of the box is on the outside of the vertex (with
  964. %     respect to the center of the diagram).  It is chosen from the
  965. %     four corners and the four midpoints of the sides.
  966. % \end{enumerate}
  967. % Therefore the four external particles in the~$B$-$\bar B$ mixing
  968. % diagram on page~\pageref{page:simple-examples} are labelled simply
  969. % by:
  970. % \begin{verbatim}
  971. %   \fmflabel{$\noexpand\bar b$}{i1}
  972. %   \fmflabel{$d$}{i2}
  973. %   \fmflabel{$\noexpand\bar d$}{o1}
  974. %   \fmflabel{$b$}{o2}
  975. % \end{verbatim}
  976. % \begin{dubious}
  977. %   Explain more of the |label| option and the default placement rules.
  978. % \end{dubious}
  979. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  980. % \subsection{Advanced usage}
  981. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  982. % \subsubsection{Shrinking}
  983. % \DescribeEnv{fmfshrink}
  984. % Shrink the lineswidths and similar parameters in the enclosed section.
  985. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  986. % \subsubsection{Multiple vertices and arcs}
  987. % \DescribeMacro{\fmfleftn}
  988. % \DescribeMacro{\fmfrightn}
  989. % \DescribeMacro{\fmfbottomn}
  990. % \DescribeMacro{\fmftopn}
  991. % \DescribeMacro{\fmfsurroundn}
  992. % The macro is|\fmfleftn| is similar to |\fmfleft|, but
  993. % |\fmfleftn{|\meta{v}\allowbreak|}{|\meta{n}|}| places the
  994. % vertices
  995. % \meta{v$[$1$]$}\ldots\meta{v$[$n$]$}.  Analogously for
  996. % the macros |\fmfrightn|, |\fmfbottomn|, |\fmftopn| and
  997. % |\fmfsurroundn|.
  998. % \DescribeMacro{\fmfvn}
  999. % The macro |\fmfvn| is similar to |\fmfv|, but
  1000. % |\fmfvn{|\meta{vertex}\allowbreak|}{|\meta{v}\allowbreak|}{|\meta{n}|}|
  1001. % places the vertices \meta{v$[$1$]$}\ldots\meta{v$[$n$]$}.
  1002. % \DescribeMacro{\fmfdotn}
  1003. % \DescribeMacro{\fmfblobn}
  1004. % The macros |\fmfdotn| and |\fmfblobn| are similar to the |\fmfdot|
  1005. % and |\fmfblob|, but |\fmfdotn{|\meta{v}|}{|\meta{n}|}| places the
  1006. % vertices \meta{v$[$1$]$}\ldots\meta{v$[$n$]$}.  Analogously for
  1007. % |\fmfblobn|.
  1008. % \DescribeEnv{fmffor}
  1009. % The environment |\begin{fmffor}{|\meta{var}\allowbreak
  1010. %   |}{|\meta{from}\allowbreak|}{|\meta{step}\allowbreak
  1011. %   |}{|\meta{to}\allowbreak|}|\allowbreak\meta{body}\allowbreak
  1012. %   |\end{fmffor}|
  1013. % executes \meta{body} multiple times, setting \meta{var} to
  1014. % $\meta{from}, \meta{from}+\meta{step}, \ldots, \meta{to}$.
  1015. % \DescribeMacro{\fmfcyclen}
  1016. % \DescribeMacro{\fmfrcyclen}
  1017. % The macro |\fmfcyclen{|\meta{style}|}{|\meta{v}|}{|\meta{n}|}|
  1018. % cyclically connects the vertices
  1019. % \meta{v$[$1$]$}\ldots\meta{v$[$n$]$}. |\fmfcyclen| operates in
  1020. % reverse order.
  1021. % An advanced application of the above \FMF{} features is shown in
  1022. % figure~\ref{fig:euler-heisenberg}, which is generated by calling
  1023. % the \TeX{} macro
  1024. % \begin{verbatim}
  1025. %   \def\EulerHeisenberg#1{%
  1026. %      \begin{fmfchar}(40,25)
  1027. %        \fmfpen{thick}
  1028. %        \fmfsurroundn{e}{#1}
  1029. %        \begin{fmffor}{n}{1}{1}{#1}
  1030. %          \fmf{photon}{e[n],i[n]}
  1031. %        \end{fmffor}
  1032. %        \fmfcyclen{fermion,tension=#1/8}{i}{#1}
  1033. %      \end{fmfchar}}
  1034. % \end{verbatim}
  1035. % with the arguments 4, 6, 8, and 10, respectively.
  1036. % \def\EulerHeisenberg#1{%
  1037. %    \begin{fmfchar}(40,25)
  1038. %      \fmfpen{thick}
  1039. %      \fmfsurroundn{e}{#1}
  1040. %      \begin{fmffor}{n}{1}{1}{#1}
  1041. %        \fmf{photon}{e[n],i[n]}
  1042. %      \end{fmffor}
  1043. %      \fmfcyclen{fermion,tension=#1/8}{i}{#1}
  1044. %    \end{fmfchar}}
  1045. % \begin{figure}
  1046. %   \begin{center}
  1047. %     \EulerHeisenberg{4} \qquad \EulerHeisenberg{6}
  1048. %   \end{center}
  1049. %   \begin{center}
  1050. %       \EulerHeisenberg{8} \qquad \EulerHeisenberg{10}
  1051. %   \end{center}
  1052. %   \caption{Higher order terms in the Euler-Heisenberg lagrangian.}
  1053. %   \label{fig:euler-heisenberg}
  1054. % \end{figure}
  1055. % Similarly, we can draw the diagrams in figures~\ref{fig:PP-rings}
  1056. % and~\ref{fig:PP-rings} from many particle physics:
  1057. % \begin{verbatim}
  1058. %   \def\PPRing#1{%
  1059. %     \begin{fmfchar}(20,20)
  1060. %       \fmfsurroundn{v}{#1}
  1061. %       \fmfdotn{v}{#1}
  1062. %       \fmfcyclen{fermion,right=0.25}{v}{#1}
  1063. %       \fmfcyclen{fermion,left=0.25}{v}{#1}
  1064. %     \end{fmfchar}}
  1065. %   \def\PHRing#1{%
  1066. %     \begin{fmfchar}(20,20)
  1067. %       \fmfsurroundn{v}{#1}
  1068. %       \fmfdotn{v}{#1}
  1069. %       \fmfcyclen{fermion,right=0.25}{v}{#1}
  1070. %       \fmfrcyclen{fermion,right=0.25}{v}{#1}
  1071. %     \end{fmfchar}}
  1072. % \end{verbatim}
  1073. % \def\PPRing#1{%
  1074. %   \begin{fmfchar}(20,20)
  1075. %     \fmfsurroundn{v}{#1}
  1076. %     \fmfdotn{v}{#1}
  1077. %     \fmfcyclen{fermion,right=0.25}{v}{#1}
  1078. %     \fmfcyclen{fermion,left=0.25}{v}{#1}
  1079. %   \end{fmfchar}}
  1080. % \def\PHRing#1{%
  1081. %   \begin{fmfchar}(20,20)
  1082. %     \fmfsurroundn{v}{#1}
  1083. %     \fmfdotn{v}{#1}
  1084. %     \fmfcyclen{fermion,right=0.25}{v}{#1}
  1085. %     \fmfrcyclen{fermion,right=0.25}{v}{#1}
  1086. %   \end{fmfchar}}
  1087. % \begin{figure}
  1088. %   \begin{center}
  1089. %     \PPRing{3}\qquad\PPRing{4}\qquad\PPRing{5}\qquad\PPRing{6}
  1090. %   \end{center}
  1091. %   \caption{Particle-particle ring diagrams}
  1092. %   \label{fig:PP-rings}
  1093. % \end{figure}
  1094. % \begin{figure}
  1095. %   \begin{center}
  1096. %     \PHRing{3}\qquad\PHRing{4}\qquad\PHRing{5}\qquad\PHRing{6}
  1097. %   \end{center}
  1098. %   \caption{Particle-hole ring diagrams}
  1099. %   \label{fig:PH-rings}
  1100. % \end{figure}
  1101. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1102. % \subsubsection{Tight arcs}
  1103. % If you add to any arc one or more |phantom| arcs they will cause
  1104. % a tighter bonding between the vertices involved
  1105. % \begin{verbatim}
  1106. %   \fmf{fermion}{v1,v2}
  1107. %   \fmf{phantom}{v1,v2}
  1108. % \end{verbatim}
  1109. % which is equivalent to
  1110. % \begin{verbatim}
  1111. %   \fmf{fermion,tension=2}{v1,v2}
  1112. % \end{verbatim}
  1113. % The |phantom| arc has to be added \emph{before} any |\fmfposition|
  1114. % involving these vertices, of course.  Here is an example from deep
  1115. % inelastic scattering.  (We do not show the |\fmfcmd{}|s in this
  1116. % example which are used for decorating the incoming proton and do not
  1117. % affect \FMF's layout decisions.)
  1118. % \vspace*{\baselineskip}
  1119. % \begin{minipage}{0.6\linewidth}
  1120. %   \begin{verbatim}
  1121. %     \fmfleft{ip,il}
  1122. %     \fmfright{oq1,oq2,d1,oq3,d2,d3,ol}
  1123. %     \fmf{fermion}{ip,vp,vq,oq3}
  1124. %     \fmf{fermion}{vp,oq1}
  1125. %     \fmf{fermion}{vp,oq2}
  1126. %     \fmf{photon}{vl,vq}
  1127. %     \fmf{fermion}{il,vl,ol}
  1128. %     \fmfblob{.15w}{vp}
  1129. %     \fmfdot{vq}
  1130. %   \end{verbatim}
  1131. % \end{minipage}
  1132. % \hfill
  1133. % \begin{minipage}{0.35\linewidth}
  1134. %   \begin{center}
  1135. %     \begin{fmfchar}(40,25)
  1136. %       \fmfpen{thick}
  1137. %       \fmfleft{ip,il}
  1138. %       \fmfright{oq1,oq2,d1,oq3,d2,d3,ol}
  1139. %       \fmf{fermion}{ip,vp,vq,oq3}
  1140. %       \fmf{fermion}{vp,oq1}
  1141. %       \fmf{fermion}{vp,oq2}
  1142. %       \fmf{photon}{vl,vq}
  1143. %       \fmf{fermion}{il,vl,ol}
  1144. %       \fmfposition
  1145. %       \fmfforce{vloc ip+(0,2thick)}{ipp}
  1146. %       \fmfforce{vloc ip-(0,2thick)}{ipm}
  1147. %       \fmfforce{vloc vp+(0,2thick)}{vpp}
  1148. %       \fmfforce{vloc vp-(0,2thick)}{vpm}
  1149. %       \fmfshift{0.12 (vloc ip - vloc vp)}{vpp}
  1150. %       \fmfshift{0.10 (vloc ip - vloc vp)}{vpm}
  1151. %       \fmf{plain}{ipp,vpp}
  1152. %       \fmf{plain}{ipm,vpm}
  1153. %       \fmfblob{.15w}{vp}
  1154. %       \fmfdot{vq}
  1155. %     \end{fmfchar}
  1156. %   \end{center}
  1157. % \end{minipage}
  1158. % As it stands, all vertices come out too far to the right, because
  1159. % the greater number of outgoing lines pulls them over.  Adding
  1160. % |\fmf{phantom}| makes the bond between the incoming vertices and the
  1161. % interactions tighter and produces a better balanced picture:
  1162. % \vspace*{\baselineskip}
  1163. % \begin{minipage}{0.6\linewidth}
  1164. %   \begin{verbatim}
  1165. %     \fmfleft{ip,il}
  1166. %     \fmfright{oq1,oq2,d1,oq3,d2,d3,ol}
  1167. %     \fmf{fermion}{ip,vp,vq,oq3}
  1168. %     \fmf{phantom}{ip,vp}
  1169. %     \fmf{fermion}{vp,oq1}
  1170. %     \fmf{fermion}{vp,oq2}
  1171. %     \fmf{photon}{vl,vq}
  1172. %     \fmf{fermion}{il,vl,ol}
  1173. %     \fmf{phantom}{il,vl}
  1174. %     \fmfblob{.15w}{vp}
  1175. %     \fmfdot{vq}
  1176. %   \end{verbatim}
  1177. % \end{minipage}
  1178. % \hfill
  1179. % \begin{minipage}{0.35\linewidth}
  1180. %   \begin{center}
  1181. %     \begin{fmfchar}(40,25)
  1182. %       \fmfpen{thick}
  1183. %       \fmfleft{ip,il}
  1184. %       \fmfright{oq1,oq2,d1,oq3,d2,d3,ol}
  1185. %       \fmf{fermion}{ip,vp,vq,oq3}
  1186. %       \fmf{phantom}{ip,vp}
  1187. %       \fmf{fermion}{vp,oq1}
  1188. %       \fmf{fermion}{vp,oq2}
  1189. %       \fmf{photon}{vl,vq}
  1190. %       \fmf{fermion}{il,vl,ol}
  1191. %       \fmf{phantom}{il,vl}
  1192. %       \fmfposition
  1193. %       \fmfforce{vloc ip+(0,2thick)}{ipp}
  1194. %       \fmfforce{vloc ip-(0,2thick)}{ipm}
  1195. %       \fmfforce{vloc vp+(0,2thick)}{vpp}
  1196. %       \fmfforce{vloc vp-(0,2thick)}{vpm}
  1197. %       \fmfshift{0.16 (vloc ip - vloc vp)}{vpp}
  1198. %       \fmfshift{0.14 (vloc ip - vloc vp)}{vpm}
  1199. %       \fmf{plain}{ipp,vpp}
  1200. %       \fmf{plain}{ipm,vpm}
  1201. %       \fmfblob{.15w}{vp}
  1202. %       \fmfdot{vq}
  1203. %     \end{fmfchar}
  1204. %   \end{center}
  1205. % \end{minipage}
  1206. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1207. % \subsubsection{Loose arcs}
  1208. % Adding arcs \emph{after} any |\fmfposition| involving these
  1209. % vertices will make these arcs loose, i.e.~they will not contribute
  1210. % to the bonding between the vertices.
  1211. % Consider the following example: suppose we want to draw a ladder
  1212. % diagram contributing to the quark form factor.  Simply linking in
  1213. % the gluons does not produce a satisfactory result:
  1214. % \vspace*{\baselineskip}
  1215. % \begin{minipage}{0.6\linewidth}
  1216. %   \begin{verbatim}
  1217. %     \fmfleft{i1} \fmfright{o1,o2}
  1218. %     \fmf{photon}{i1,v4}
  1219. %     \fmf{quark}{o1,v1,v2,v3,v4,v5,v6,v7,o2}
  1220. %     \fmf{gluon}{v1,v7}
  1221. %     \fmf{gluon}{v2,v6}
  1222. %     \fmf{gluon}{v3,v5}
  1223. %   \end{verbatim}
  1224. % \end{minipage}
  1225. % \hfill
  1226. % \begin{minipage}{0.35\linewidth}
  1227. %   \begin{center}
  1228. %    \begin{fmfchar}(40,25)
  1229. %      \fmfpen{thick}
  1230. %      \fmfleft{i1} \fmfright{o1,o2}
  1231. %      \fmf{photon}{v4,i1}
  1232. %      \fmf{quark}{o1,v1,v2,v3,v4,v5,v6,v7,o2}
  1233. %      \fmf{gluon}{v1,v7}
  1234. %      \fmf{gluon}{v2,v6}
  1235. %      \fmf{gluon}{v3,v5}
  1236. %    \end{fmfchar}
  1237. %   \end{center}
  1238. % \end{minipage}
  1239. % What went wrong?  Obviously the gluons are bonding the quark lines
  1240. % too strongly.  The fix is simple: just exclude the gluons from the
  1241. % calculation and add them later as infinitely stretchable:
  1242. % \vspace*{\baselineskip}
  1243. % \begin{minipage}{0.6\linewidth}
  1244. %   \begin{verbatim}
  1245. %     \fmfleft{i1} \fmfright{o1,o2}
  1246. %     \fmf{photon}{i1,v4}
  1247. %     \fmf{quark}{o1,v1,v2,v3,v4,v5,v6,v7,o2}
  1248. %     \fmfposition
  1249. %     \fmf{gluon}{v1,v7}
  1250. %     \fmf{gluon}{v2,v6}
  1251. %     \fmf{gluon}{v3,v5}
  1252. %   \end{verbatim}
  1253. % \end{minipage}
  1254. % \hfill
  1255. % \begin{minipage}{0.35\linewidth}
  1256. %   \begin{center}
  1257. %    \begin{fmfchar}(40,25)
  1258. %      \fmfpen{thick}
  1259. %      \fmfleft{i1} \fmfright{o1,o2}
  1260. %      \fmf{photon}{v4,i1}
  1261. %      \fmf{quark}{o1,v1,v2,v3,v4,v5,v6,v7,o2}
  1262. %      \fmfposition
  1263. %      \fmf{gluon}{v1,v7}
  1264. %      \fmf{gluon}{v2,v6}
  1265. %      \fmf{gluon}{v3,v5}
  1266. %    \end{fmfchar}
  1267. %   \end{center}
  1268. % \end{minipage}
  1269. % Another instructive example is the following: imagine you want to
  1270. % draw a typical non-resonant contribution to~$e^+e^-\to 4f$.  The
  1271. % obvious solution doesn's look right.
  1272. % \vspace*{\baselineskip}
  1273. % \begin{minipage}{0.6\linewidth}
  1274. %   \begin{verbatim}
  1275. %     \fmfleft{i1,i2}
  1276. %     \fmfright{o1,o2,o3,o4}
  1277. %     \fmf{fermion}{i1,v1,i2}
  1278. %     \fmf{photon}{v1,v2}
  1279. %     \fmf{fermion}{o1,v2,v3,o4}
  1280. %     \fmf{photon}{v3,v4}
  1281. %     \fmf{fermion}{o3,v4,o2}
  1282. %   \end{verbatim}
  1283. % \end{minipage}
  1284. % \hfill
  1285. % \begin{minipage}{0.35\linewidth}
  1286. %   \begin{center}
  1287. %     \begin{fmfchar}(40,25)
  1288. %       \fmfpen{thick}
  1289. %       \fmfleft{i1,i2}
  1290. %       \fmfright{o1,o2,o3,o4}
  1291. %       \fmf{fermion}{i1,v1,i2}
  1292. %       \fmf{photon}{v1,v2}
  1293. %       \fmf{fermion}{o1,v2,v3,o4}
  1294. %       \fmf{photon}{v3,v4}
  1295. %       \fmf{fermion}{o3,v4,o2}
  1296. %     \end{fmfchar}
  1297. %   \end{center}
  1298. % \end{minipage}
  1299. % One way to fix it is to |\fmfshift| the three rightmost vertices by
  1300. % hand:
  1301. % \vspace*{\baselineskip}
  1302. % \begin{minipage}{0.6\linewidth}
  1303. %   \begin{verbatim}
  1304. %     \fmfleft{i1,i2}
  1305. %     \fmfright{o1,o2,o3,o4}
  1306. %     \fmf{fermion}{i1,v1,i2}
  1307. %     \fmf{photon}{v1,v2}
  1308. %     \fmf{fermion}{o1,v2,v3,o4}
  1309. %     \fmf{photon}{v3,v4}
  1310. %     \fmf{fermion}{o3,v4,o2}
  1311. %     \fmfposition
  1312. %     \fmfshift{-.1w,0}{v2,v3,v4}
  1313. %   \end{verbatim}
  1314. % \end{minipage}
  1315. % \hfill
  1316. % \begin{minipage}{0.35\linewidth}
  1317. %   \begin{center}
  1318. %     \begin{fmfchar}(40,25)
  1319. %       \fmfpen{thick}
  1320. %       \fmfleft{i1,i2}
  1321. %       \fmfright{o1,o2,o3,o4}
  1322. %       \fmf{fermion}{i1,v1,i2}
  1323. %       \fmf{photon}{v1,v2}
  1324. %       \fmf{fermion}{o1,v2,v3,o4}
  1325. %       \fmf{photon}{v3,v4}
  1326. %       \fmf{fermion}{o3,v4,o2}
  1327. %       \fmfposition
  1328. %       \fmfshift{-.1w,0}{v2,v3,v4}
  1329. %     \end{fmfchar}
  1330. %   \end{center}
  1331. % \end{minipage}
  1332. % A smarter solution is again to make certain arcs stretchable:
  1333. % \vspace*{\baselineskip}
  1334. % \begin{minipage}{0.6\linewidth}
  1335. %   \begin{verbatim}
  1336. %     \fmfleft{i1,i2}
  1337. %     \fmfright{o1,o2,o3,o4}
  1338. %     \fmf{fermion}{i1,v1,i2}
  1339. %     \fmf{photon}{v1,v2}
  1340. %     \fmf{fermion}{o1,v2,v3,o4}
  1341. %     \fmfposition
  1342. %     \fmf{photon}{v3,v4}
  1343. %     \fmf{fermion}{o3,v4,o2}
  1344. %   \end{verbatim}
  1345. % \end{minipage}
  1346. % \hfill
  1347. % \begin{minipage}{0.35\linewidth}
  1348. %   \begin{center}
  1349. %     \begin{fmfchar}(40,25)
  1350. %       \fmfpen{thick}
  1351. %       \fmfleft{i1,i2}
  1352. %       \fmfright{o1,o2,o3,o4}
  1353. %       \fmf{fermion}{i1,v1,i2}
  1354. %       \fmf{photon}{v1,v2}
  1355. %       \fmf{fermion}{o1,v2,v3,o4}
  1356. %       \fmfposition
  1357. %       \fmf{photon}{v3,v4}
  1358. %       \fmf{fermion}{o3,v4,o2}
  1359. %     \end{fmfchar}
  1360. %   \end{center}
  1361. % \end{minipage}
  1362. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1363. % \subsubsection{Avoiding continuously tight and loose arcs}
  1364. % I have been very reluctant to implement continuously tight and loose
  1365. % arcs in \FMF, because it introduces to much opportunity for
  1366. % ``fiddling'' on the user's part.  However, since the present
  1367. % implementation blends rather nicely with the options syntax, I have
  1368. % decided to add it anyway.  I hope that most diagrams will be created
  1369. % without too much ``fiddling''.
  1370. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1371. % \subsubsection{Raw \MF}
  1372. % Some more advanced features of \FMF{} are more conveniently
  1373. % accessed through raw \MF{} commands.  This can either be
  1374. % achieved by preparing a \MF{} input file or by using |\fmfcmd|
  1375. % extensively.  The latter apprach is usally more convenient.
  1376. % \DescribeMacro{\fmfcmd}
  1377. % The |\fmfcmd| macro writes its argument into the \MF{} input
  1378. % file generated by \FMF.  While some experience in using
  1379. % \MF{} doesn't hurt here, this approach can simplify the
  1380. % production of complex diagrams considerably.  
  1381. % Here's an interesting ``abuse'' of \FMF.  Using the undocumented
  1382. % \MF{} macros (like |vdraw_vertex_label|) is possible, though not
  1383. % supported.  In a future versions, these features will be made
  1384. % available through supported interfaces.
  1385. % \begin{minipage}{0.6\linewidth}
  1386. %   \begin{verbatim}
  1387. %   \begin{fmfchar*}(40,40)\fmfcmd{
  1388. %     pair o,xm,xp,ym,yp;
  1389. %     pair v.loc; string v.lbl;
  1390. %     o:=(.5w,.1h);
  1391. %     xm:=(0,.1h); xp:=(w,.1h);
  1392. %     ym:=(.5w,0); yp:=(.5w,h);
  1393. %     v.loc := xp; v.lbl := "$x$";
  1394. %     v.lbl.ang := -135; v.lbl.dist := 2;
  1395. %     vdraw_vertex_label v;
  1396. %     v.loc := yp; v.lbl := "$y=x^2$";
  1397. %     vdraw_vertex_label v;
  1398. %     pickup pencircle scaled thin;
  1399. %     draw xm--xp; draw ym--yp;
  1400. %     pickup pencircle scaled thick;
  1401. %     xs:=xpart(xp-o); ys:=ypart(yp-o);
  1402. %     draw (o + (-xs,ys)) for n = -9 upto 10:
  1403. %       --(o + (xs*(n/10),ys*((n/10)**2)))
  1404. %     endfor;}
  1405. %   \end{fmfchar*}
  1406. %   \end{verbatim}
  1407. % \end{minipage}
  1408. % \hfill
  1409. % \begin{minipage}{0.35\linewidth}
  1410. %   \begin{center}
  1411. %     \begin{fmfchar*}(40,40)\fmfcmd{
  1412. %       pair o,xm,xp,ym,yp;
  1413. %       pair v.loc; string v.lbl;
  1414. %       o:=(.5w,.1h);
  1415. %       xm:=(0,.1h); xp:=(w,.1h);
  1416. %       ym:=(.5w,0); yp:=(.5w,h);
  1417. %       v.loc := xp; v.lbl := "$x$";
  1418. %       v.lbl.ang := -135; v.lbl.dist := 2;
  1419. %       vdraw_vertex_label v;
  1420. %       v.loc := yp; v.lbl := "$y=x^2$";
  1421. %       vdraw_vertex_label v;
  1422. %       pickup pencircle scaled thin;
  1423. %       draw xm--xp; draw ym--yp;
  1424. %       pickup pencircle scaled thick;
  1425. %       xs:=xpart(xp-o); ys:=ypart(yp-o);
  1426. %       draw (o + (-xs,ys)) for n = -9 upto 10:
  1427. %         --(o + (xs*(n/10),ys*((n/10)**2)))
  1428. %       endfor;}
  1429. %     \end{fmfchar*}
  1430. %   \end{center}
  1431. % \end{minipage}
  1432. % Finally, for the curious, here is how to draw the circular gluons in
  1433. % figure~\ref{fig:gluons}:
  1434. % \begin{verbatim}
  1435. %   \fmfcmd{draw_gluon (fullcircle scaled .5w shifted (.5w,.5h));}
  1436. %   \fmfcmd{draw_gluon (reverse fullcircle scaled .5w shifted (.5w,.5h));}
  1437. % \end{verbatim}
  1438. % \begin{figure}
  1439. %   \begin{center}
  1440. %     \begin{fmfchar}(40,40)
  1441. %       \fmfcmd{draw_gluon (fullcircle scaled .5w shifted (.5w,.5h));}
  1442. %     \end{fmfchar}
  1443. %     \qquad
  1444. %     \begin{fmfchar}(40,40)
  1445. %       \fmfcmd{draw_gluon (reverse fullcircle scaled .5w shifted (.5w,.5h));}
  1446. %     \end{fmfchar}
  1447. %   \end{center}
  1448. %   \caption{Circular gluons.}
  1449. %   \label{fig:gluons}
  1450. % \end{figure}
  1451. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1452. % \subsection{Limitations}
  1453. % Currently the most severe limitation lies in the size of the
  1454. % generated pictures.  The largest number \MF{} can represent
  1455. % internally is~4095.99998 and this is also the largest value any
  1456. % coordinate measured in pixels can assume.  At the most popular
  1457. % laserprinter resolution of~300 dots per inch (dpi), this corresponds
  1458. % to a horizontal and vertical extension of about~346mm, which is
  1459. % plenty and we're more likely to hit the internal limits on the
  1460. % complexity of a picture.  However, at the proof mode resolution
  1461. % of~2601.72dpi, this is reduced to slightly less than~40mm and we're
  1462. % running the risk of arithmetic overflow in internal calculations much
  1463. % earlier.
  1464. % There are two potential solutions of different scope and complexity:
  1465. % \begin{itemize}
  1466. %   \item{} Since John Hobby's \MP{} is now available without a
  1467. %     non-disclosure agreement from AT\&T, one solution is to replace
  1468. %     \MF{} by \MP, which doesn't suffer from the size
  1469. %     limitations\footnote{%
  1470. %       Right now, \FMF's \MP{} support is still
  1471. %       somewhat kludged, but the functionality is there.}
  1472. %     This comes with a small price paid in reduced portability of the
  1473. %     generated output, but as already stated above in the case of
  1474. %     |axodraw|, the ubiquity of PostScript printers (and the free
  1475. %     GhostScript interpreter) makes this a minor point.
  1476. %   \item{} The more ambitious solutions will be ``virtual pictures''
  1477. %     (see section~\ref{sec:virtual-pictures}).
  1478. % \end{itemize}
  1479. % \end{fmffile}
  1480. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1481. % \section*{Acknowledgements}
  1482. % I am most grateful to Wolfgang Kilian, who pushed \FMF's predecessor
  1483. % |feynman.mf| to its limits~\cite{Kil94}.  His needs were valuable
  1484. % input to \FMF.  Thanks also to Angelika Himmler and Uwe Mayer for
  1485. % acting as guinea pigs.
  1486. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1487. % \begin{thebibliography}{99}
  1488. %   \bibitem{TeX} Donald E.~Knuth, \textit{The \TeX{}book},
  1489. %      Addison-Wesley, Reading, 1986.
  1490. %   \bibitem{LaTeX} Leslie Lambort, \textit{\LaTeX{} --- A
  1491. %     Documentation Preparation System},
  1492. %     Addison-Wesley, Reading, 1985.
  1493. %   \bibitem{LaTeX-Companion} Michel Goosens, Frank Mittelbach, and
  1494. %     Alexander Samarin, \textit{The \LaTeX{} Companion},
  1495. %     Addison-Wesley, Reading, 1994.
  1496. %   \bibitem{MF} Donald E.~Knuth, \textit{The \MF{}book},
  1497. %      Addison-Wesley, Reading, 1986.
  1498. %   \bibitem{MetaPost} John D.~Hobby, \textit{A User's Manual for
  1499. %     \MP}, Computer Science Report \#162, AT\&T Bell
  1500. %     Laboratories, April 1992.
  1501. %   \bibitem{hoenig} Alan Hoenig, \textit{When \TeX{} and \MF{}
  1502. %     Work Together}, in \textit{Proceedings of the 7th European
  1503. %     \TeX{} Conference, Prague}, p.~1, September 1992.
  1504. %   \bibitem{levine} Micheal J.~S.~Levine,
  1505. %     Comp.~Phys.~Comm.~\textbf{58} (1990) 181.
  1506. %   \bibitem{axodraw} Jos Vermaseren, \texttt{axodraw}.
  1507. %   \bibitem{mfpic} Thomas E.~Leathrum, \texttt{mfpic}.
  1508. %   \bibitem{madgraph} Tim Stelzer and Bill Long, \texttt{MADGRAPH},
  1509. %     hep-ph/93mmxxx.
  1510. %   \bibitem{Kil94} Wolfgang Kilian, Doctoral Thesis, Technical
  1511. %     University Darmstadt, 1994.
  1512. % \end{thebibliography}
  1513. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1514. % \StopEventually{\PrintIndex\PrintChanges}
  1515. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1516. % \section{\TeX{} macros}
  1517. % It's is good practice to identify this version of the document style
  1518. % option.  We do this by parsing an RCS |Id| string and storing the
  1519. % result in the conventional \TeX{} control sequences:
  1520. % \changes{1.1}{1994/05/19}{%
  1521. %   Don't loose on {\tt RCS} strings even iff the dollar signs have
  1522. %   been removed.}
  1523. % \changes{1.9}{1995/02/18}{\LaTeX~2.09 compatibility}
  1524. %    \begin{macrocode}
  1525. %<*style>
  1526. %<!209>\NeedsTeXFormat{LaTeX2e}
  1527. {\def\RCS#1#2\endRCS{%
  1528.   \ifx$#1%
  1529.     \@RCS $#2 \endRCS
  1530.   \else
  1531.     \@RCS $*: #1#2$ \endRCS
  1532.   \fi}%
  1533.  \def\@RCS $#1: #2,v #3 #4 #5 #6$ \endRCS{%
  1534.    \gdef\filename{#2}%
  1535.    \gdef\fileversion{v#3}%
  1536.    \gdef\filedate{#4}%
  1537.    \gdef\docdate{#4}}%
  1538. \RCS feynmf.dtx,v 1.10 1995/02/18 16:42:18 ohl Exp \endRCS}%
  1539. %    \end{macrocode}
  1540. % And now the standard procedure:
  1541. % \changes{1.4}{1994/05/27}{%
  1542. %   \MP{} support: identification part, include
  1543. %   \texttt{graphicx} and pass options.}
  1544. %    \begin{macrocode}
  1545. %<*!mp>
  1546. %<!209>\ProvidesPackage{feynmf}[\filedate\space LaTeX2e package]
  1547. \typeout{Package: `feynmf'
  1548.    \fileversion\space <\filedate> (tho) PRELIMINARY TEST RELEASE}
  1549. \wlog{English documentation \@spaces<\docdate> (tho)}
  1550. %</!mp>
  1551. %<*mp>
  1552. %<!209>\ProvidesPackage{feynmp}[\filedate\space LaTeX2e package]
  1553. \typeout{Package: `feynmp'
  1554.    \fileversion\space <\filedate> (tho) PRELIMINARY TEST RELEASE}
  1555. \wlog{English documentation \@spaces<\docdate> (tho)}
  1556. %    \end{macrocode}
  1557. % Every option we don't understand (that is \emph{every} option) is
  1558. % sent down to |graphicx|:
  1559. %    \begin{macrocode}
  1560. %<*!209>
  1561. \DeclareOption*{\PassOptionsToPackage{\CurrentOption}{graphicx}}
  1562. \ProcessOptions
  1563. %    \end{macrocode}
  1564. % For the sake of Portabilitical Correctness, we use \LaTeX's
  1565. % |graphicx| for including PostScript, instead of the simpler |epsf|
  1566. % which comes with |dvips| and would have sufficed
  1567. %    \begin{macrocode}
  1568. \RequirePackage{graphicx}
  1569. %</!209>
  1570. %<209>\input epsf.sty
  1571. %</mp>
  1572. %    \end{macrocode}
  1573. % Compatibility macros for \LaTeX~2.09:
  1574. %    \begin{macrocode}
  1575. %<*209>
  1576. \def\InputIfFileExists#1#2#3{%
  1577.   \openin\@inputcheck#1 %
  1578.   \ifeof\@inputcheck
  1579.     \closein\@inputcheck
  1580.     #3%
  1581.   \else
  1582.     \closein\@inputcheck
  1583.     #2%
  1584.     \input{#1}
  1585.   \fi}
  1586. \def\IfFileExists#1#2#3{%
  1587.   \openin\@inputcheck#1 %
  1588.   \ifeof\@inputcheck
  1589.     \closein\@inputcheck
  1590.     #3%
  1591.   \else
  1592.     \closein\@inputcheck
  1593.     #2%
  1594.   \fi}
  1595. %</209>
  1596. %    \end{macrocode}
  1597. % \begin{dubious}
  1598. %   We should |\||mdqon| at the end only if the German extensions are
  1599. %   really active, not just loaded.
  1600. % \end{dubious}
  1601. %    \begin{macrocode}
  1602. \let\mdqrestore\relax
  1603. \@ifundefined{mdqoff}{}{%
  1604.   \mdqoff
  1605.   \let\mdqrestore\mdqon}
  1606. %    \end{macrocode}
  1607. % \begin{macro}{\fmfcmd}
  1608. % The entrance through which our commands enter the world of
  1609. % \MF.  Note the |\ignorespaces|: we need to avoid spurious
  1610. % blanks in the output list.
  1611. %    \begin{macrocode}
  1612. \newwrite\@outfmf
  1613. \def\fmfcmd#1{%
  1614.   \immediate\write\@outfmf{#1}\ignorespaces}
  1615. %    \end{macrocode}
  1616. % \end{macro}
  1617. % \begin{macro}{\fmffile}
  1618. % This environment encloses each \MF{} input file.  The single
  1619. % argument gives the name of the file.
  1620. % \changes{1.1}{1994/05/16}{%
  1621. %   Stupid: {\tt fileversion} can be reset by other packages, store
  1622. %   the current value in {\tt fmf@fileversion} and use this one.}
  1623. % \changes{1.1}{1994/05/20}{%
  1624. %   Pass RCS revision in a string.}
  1625. % \changes{1.4}{1994/05/27}{\MP{} support: write \MP{} file.}
  1626. % \changes{1.9}{1995/01/18}{%
  1627. %   Protect against wrong arguments to \texttt{fmffile}.}
  1628. %    \begin{macrocode}
  1629. {\catcode`\%=11\gdef\p@rcent{%}}
  1630. \edef\fmf@fileversion{\fileversion}
  1631. \def\fmffile#1{%
  1632.   \def\thefmffile{#1}%
  1633.   \equaltojobname{\thefmffile}{%
  1634.     \errhelp={The argument of \fmffile MUST NOT be identical to the^^J%
  1635.               name of your main input file!  I will use fmfdefault.mf^^J%
  1636.               this time around, but you'd better fix your code now!}%
  1637.     \errmessage{Invalid arument of \string\fmffile!}%
  1638.     \def\thefmffile{fmfdefault}}{}%
  1639. %<*!mp>
  1640.   \immediate\openout\@outfmf=\thefmffile.mf\relax
  1641.   \fmfcmd{\p@rcent\space \thefmffile.mf -- do not edit, %
  1642.           generated automatically by \jobname.tex^^J%
  1643.           input feynmf^^J%
  1644.           require_RCS_revision "\expandafter\@gobble\fmf@fileversion";}%
  1645. %</!mp>
  1646. %<*mp>
  1647.   \immediate\openout\@outfmf=\thefmffile.mp\relax
  1648.   \fmfcmd{\p@rcent\space \thefmffile.mp -- do not edit, %
  1649.           generated automatically by \jobname.tex^^J%
  1650.           input feynmp^^J%
  1651.           require_RCS_revision "\expandafter\@gobble\fmf@fileversion";}%
  1652. %</mp>
  1653. %    \end{macrocode}
  1654. % The following trick has been taken from |mfpic|~\cite{mfpic}:
  1655. % proceed even if the font is not available yet, because we have to
  1656. % write the \MF{} file first.
  1657. % \changes{1.4}{1994/05/27}{\MP{} support: don't open \texttt{tfm} file.}
  1658. %    \begin{macrocode}
  1659. %<*!mp>
  1660.   \batchmode
  1661.   \font\f@ynmf=\thefmffile
  1662.   \errorstopmode
  1663. %    \end{macrocode}
  1664. % Inform the user:
  1665. %    \begin{macrocode}
  1666.   \ifx\f@ynmf\nullfont
  1667.     \def\f@ynmf{feynmf character:}%
  1668.     \typeout{%
  1669.       feynmf: File \thefmffile.tfm not found:^^J%
  1670.       feynmf: Process \thefmffile.mf with METAFONT and then %
  1671.               reprocess this file.}%
  1672.   \else
  1673.     \typeout{%
  1674.       feynmf: File \thefmffile.tfm found.^^J%
  1675.       feynmf: Nevertheless, if the picture has changed, %
  1676.               reprocess \thefmffile.mf.^^J%
  1677.       feynmf: If dimension have changed, reprocess \thefmffile.mf %
  1678.               and \jobname.tex.}%
  1679.   \fi
  1680. %</!mp>
  1681. %    \end{macrocode}
  1682. % Count the characters
  1683. %    \begin{macrocode}
  1684.   \setcounter{fmfchar}{0}}
  1685. \let\thefmffile\relax
  1686. \newcounter{fmfchar}
  1687. %    \end{macrocode}
  1688. % \end{macro}
  1689. % \begin{macro}{\equaltojobname}
  1690. % Here's a kludge for comparing strings to |\jobname|.  I dont quite
  1691. % understand, why the |\meaning| hack is necessary, but |\jobname|
  1692. % behaves differently from other macros with respect to |\ifx|.
  1693. %    \begin{macrocode}
  1694. \def\equaltojobname#1#2#3{%
  1695.   \edef\@tempa{#1}%
  1696.   \edef\@tempa{\meaning\@tempa}%
  1697.   \edef\@tempb{\jobname}%
  1698.   \edef\@tempb{\meaning\@tempb}%
  1699.   \ifx\@tempa\@tempb
  1700.     #2
  1701.   \else
  1702.     #3
  1703.   \fi}
  1704. %    \end{macrocode}
  1705. % \end{macro}
  1706. % \begin{macro}{\endfmffile}
  1707. % And here is how we close the |fmffile| environment:
  1708. %    \begin{macrocode}
  1709. \def\endfmffile{%
  1710.   \fmfcmd{\p@rcent\space the end.^^J%
  1711.           end.^^J%
  1712.           endinput;}%
  1713.   \let\thefmffile\relax
  1714.   \immediate\closeout\@outfmf}
  1715. %    \end{macrocode}
  1716. % \end{macro}
  1717. % \begin{macro}{\fmf@char}
  1718. % This is the bulk of the environment used for each ``character''
  1719. % drawn by \MF.
  1720. % \changes{1.5}{1994/08/17}{%
  1721. %   Removed definiton of \texttt{sharp}.  It's never used and
  1722. %   conflicts with the $\sharp$ symbol.}
  1723. %    \begin{macrocode}
  1724. {\catcode`\#=11\gdef\sh@rp{#}}
  1725. \def\fmf@char#1#2{%
  1726. %    \end{macrocode}
  1727. % Make sure that a \MF{} file is open, otherwise \emph{really}
  1728. % obscure error messages are possible:
  1729. % \changes{1.3}{1994/05/23}{%
  1730. %   Make sure that a \MF{} file is open, otherwise \emph{really}
  1731. %   obscure error messages are possible.}
  1732. %    \begin{macrocode}
  1733.   \ifx\thefmffile\relax
  1734.     \errhelp={Outside a fmffile environment, I have no clue as to where^^J%
  1735.               the METAFONT commands should go.   I will use fmfdefault.mf^^J%
  1736.               for this character, but you'd better fix your code!}%      
  1737.     \errmessage{I detected a fmfchar environment outside of fmffile}%
  1738.     \fmffile{fmfdefault}
  1739.   \fi
  1740. %    \end{macrocode}
  1741. % We can't use |\stepcounter| because of the |amstext| option of
  1742. % AMS-\LaTeX{} disables it sometimes.
  1743. % \changes{1.9}{1995/01/07}{Don't use \texttt{stepcounter}.}
  1744. %    \begin{macrocode}
  1745.   \global\expandafter\advance\csname c@fmfchar\endcsname \@ne
  1746. %    \end{macrocode}
  1747. % Start \MF{} character:
  1748. %    \begin{macrocode}
  1749.   \fmfcmd{beginchar(\thefmfchar, #1*\the\unitlength\sh@rp, %
  1750.                                  #2*\the\unitlength\sh@rp, 0);^^J%
  1751.             "feynmf: \thefmfchar";}%
  1752.   \fmfcmd{LaTeX_unitlength:=\the\unitlength;}%
  1753.   \fmfinit
  1754.   \fmfpen{thin}}
  1755. %    \end{macrocode}
  1756. % \end{macro}
  1757. % \begin{macro}{\fmfchar}
  1758. % The plain version, no labels, no enclosing |picture| environment
  1759. %    \begin{macrocode}
  1760. \def\fmfchar(#1,#2){%
  1761.   \fmf@char{#1}{#2}%
  1762. %    \end{macrocode}
  1763. % Place the character:
  1764. % \changes{1.4}{1994/05/27}{\MP{} support: include PostScript file.}
  1765. % \changes{1.9}{1995/02/18}{\LaTeX~2.09 compatibility}
  1766. %    \begin{macrocode}
  1767. %<!mp>{\f@ynmf \char\value{fmfchar}}%
  1768. %<*mp>
  1769.   \leavevmode
  1770.   \IfFileExists{\thefmffile.\thefmfchar}%
  1771. %<*!209>
  1772.    {\includegraphics[type=eps,ext=\thefmfchar,read=\thefmfchar]%
  1773.       {\thefmffile}}%
  1774. %</!209>
  1775. %<*209>
  1776.    {\epsffile{\thefmffile.\thefmfchar}}%
  1777. %</209>
  1778.    {\typeout{%
  1779.       feynmp: File \thefmffile.\thefmfchar\space not found:^^J%
  1780.       feynmp: Process \thefmffile.mp with MetaPost and then %
  1781.               reprocess this file.}}%
  1782. %</mp>
  1783.   \ignorespaces}
  1784. %    \end{macrocode}
  1785. % \end{macro}
  1786. % \begin{macro}{\endfmfchar}
  1787. %    \begin{macrocode}
  1788. \def\endfmfchar{%
  1789.   \fmfposition
  1790.   \fmfdraw
  1791.   \fmfcmd{endchar;}}
  1792. %    \end{macrocode}
  1793. % \end{macro}
  1794. % \begin{macro}{\fmfchar*}
  1795. % The extended version, with labels and |picture| environment.
  1796. %    \begin{macrocode}
  1797. \@namedef{fmfchar*}(#1,#2){%
  1798.   \begin{picture}(#1,#2)
  1799.     \fmf@char{#1}{#2}%
  1800. %    \end{macrocode}
  1801. % Process the \MF{} output for labels (if any), enforcing |%| as
  1802. % comment character.
  1803. %    \begin{macrocode}
  1804. %<*!mp>
  1805.     {\catcode`\%=14\relax
  1806.       \grepfile{%
  1807.         \thefmffile.\thefmfchar}{%
  1808.         \thefmffile.log}{%
  1809.         \thefmffile.t\thefmfchar}}%
  1810. %</!mp>
  1811. %    \end{macrocode}
  1812. % Place the character:
  1813. % \changes{1.4}{1994/05/27}{\MP{} support: include PostScript file.}
  1814. %    \begin{macrocode}
  1815. %<!mp>\put(0,0){{\f@ynmf \char\value{fmfchar}}}%
  1816. %<*mp>
  1817.   \IfFileExists{\thefmffile.\thefmfchar}%
  1818. %<*!209>
  1819.    {\put(0,0){\includegraphics[type=eps,ext=\thefmfchar,read=\thefmfchar]%
  1820.                 {\thefmffile}}}%
  1821. %</!209>
  1822. %<*209>
  1823.    {\put(0,0){\epsffile{\thefmffile.\thefmfchar}}}%
  1824. %</209>
  1825.    {\typeout{%
  1826.       feynmp: File \thefmffile.\thefmfchar\space not found:^^J%
  1827.       feynmp: Process \thefmffile.mp with MetaPost and then %
  1828.               reprocess this file.}}%
  1829. %</mp>
  1830.       \ignorespaces}
  1831. %    \end{macrocode}
  1832. % \end{macro}
  1833. % \begin{macro}{\endfmfchar*}
  1834. %    \begin{macrocode}
  1835. \@namedef{endfmfchar*}{%
  1836.     \endfmfchar
  1837. %    \end{macrocode}
  1838. % Enforce |%| as comment character:
  1839. %    \begin{macrocode}
  1840.     {\catcode`\%=14\relax
  1841.       \InputIfFileExists{\thefmffile.t\thefmfchar}{}{%
  1842.         \typeout{%
  1843.           feynmf: Label file \thefmffile.t\thefmfchar\space not found:^^J%
  1844. %<!mp>    feynmf: Process \thefmffile.mf with METAFONT and then %
  1845. %<mp>     feynmf: Process \thefmffile.mp with MetaPost and then %
  1846.                   reprocess this file.}}}%
  1847.   \end{picture}}
  1848. %    \end{macrocode}
  1849. % \end{macro}
  1850. % \begin{macro}{\fmfframe}
  1851. % This is used to allocate additional space around a |fmfchar*|, since
  1852. % the labels (or the diagram itself) might overshoot.
  1853. % |\fmfchar(|\meta{left}|,|\meta{top}|)(|\meta{right}|,|\meta{bottom}|){|%
  1854. % \meta{box}|}| puts an invisible frame of the given dimensions
  1855. % (measured in |\unitlength|) around \meta{box}.
  1856. %    \begin{macrocode}
  1857. \def\fmfframe(#1,#2)(#3,#4)#5{%
  1858.   \leavevmode
  1859.   \hbox{\vbox{\vskip#2\unitlength\par
  1860.               \hbox{\hskip#1\unitlength#5\hskip#3\unitlength}\par
  1861.               \vskip#4\unitlength}}}
  1862. %    \end{macrocode}
  1863. % \end{macro}
  1864. % \begin{macro}{\fmfpen}
  1865. % Picup a |pencircle| scaled by the argument.
  1866. %    \begin{macrocode}
  1867. \def\fmfpen#1{\fmfcmd{pickup pencircle scaled #1;}}
  1868. %    \end{macrocode}
  1869. % \end{macro}
  1870. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1871. % \subsection{Grep}
  1872. % \label{sec:grep}
  1873. % \begin{macro}{\grepfile}
  1874. % The macro |\grepfile{|\meta{pattern}|}{|\meta{in}|}{|\meta{out}|}|
  1875. % writes all lines matching |:|\meta{pattern}|:| from file \meta{in}
  1876. % to file \meta{out} after stripping off the pattern.
  1877. % \begin{dubious}
  1878. %   Pattern matching on lines with a single leading colon fails.
  1879. % \end{dubious}
  1880. % \changes{1.4}{1994/05/28}{%
  1881. %   Don't include the \texttt{grep} macros in the \MP{} version.
  1882. %   \texttt{write} makes them obsolete.}
  1883. %    \begin{macrocode}
  1884. %<*!mp>
  1885. \def\grepfile#1#2#3{%
  1886.   \begingroup
  1887. %    \end{macrocode}
  1888. % Hash the pattern and open the input and output streams:
  1889. %    \begin{macrocode}
  1890.     \edef\pattern{\csname*grep*#1*\endcsname}%
  1891.     \immediate\openin\grep@infile #2\relax
  1892.     \ifeof\grep@infile
  1893.     \else
  1894.       \grep@outopenfalse
  1895. %    \end{macrocode}
  1896. % Don't add anything at the end of input lines and don't expand
  1897. % anything we've read from the file:
  1898. %    \begin{macrocode}
  1899.       \endlinechar=-1
  1900.       \catcode`\\=12\relax
  1901. %    \end{macrocode}
  1902. % Loop over the input lines until end of file occurs:
  1903. %    \begin{macrocode}
  1904.       \loop
  1905.         \read\grep@infile to \grep@lbuf
  1906.         \ifeof\grep@infile
  1907.           \grep@contfalse
  1908.         \else
  1909.           \grep@conttrue
  1910. %    \end{macrocode}
  1911. % Iff the input line is not empty, use |\grep@aline| to examine its
  1912. % contents and, iff the pattern matched, write a line to the output file.
  1913. %    \begin{macrocode}
  1914.           \ifx\grep@lbuf\empty
  1915.           \else
  1916.             \expandafter\grep@aline\grep@lbuf\sentinel
  1917.             \ifx\pattern\grep@tag
  1918. %    \end{macrocode}
  1919. % Delayed open (this avoids empty files):
  1920. %    \begin{macrocode}
  1921.               \ifgrep@outopen
  1922.               \else
  1923.                  \immediate\openout\grep@outfile #3\relax
  1924.                  \immediate\write\grep@outfile{\p@rcent\space #3 %
  1925.                     -- generated automatically from #2}%
  1926.                  \immediate\write\grep@outfile{\p@rcent\space
  1927.                     Think twice before editing THIS file!}%
  1928.                  \grep@outopentrue
  1929.               \fi
  1930.               \immediate\write\grep@outfile{\grep@val}%
  1931.             \fi
  1932.           \fi
  1933.         \fi
  1934.       \ifgrep@cont
  1935.       \repeat
  1936. %    \end{macrocode}
  1937. % Close the files after we're done.
  1938. % \changes{1.1}{1994/05/16}{%
  1939. %   Stupid: {\tt closein} the input stream, don't use {\tt closeout} on it.}
  1940. %    \begin{macrocode}
  1941.       \ifgrep@outopen
  1942.         \immediate\closeout\grep@outfile
  1943.       \fi
  1944.     \fi
  1945.     \immediate\closein\grep@infile
  1946.   \endgroup}
  1947. %    \end{macrocode}
  1948. % \end{macro}
  1949. % \begin{macro}{\grep@infile}
  1950. %  \begin{macro}{\grep@outfile}
  1951. % The I/O streams for the grep facility
  1952. %    \begin{macrocode}
  1953. \newread\grep@infile
  1954. \newwrite\grep@outfile
  1955. %    \end{macrocode}
  1956. %  \end{macro}
  1957. % \end{macro}
  1958. % \begin{macro}{\ifgrep@cont}
  1959. %   \begin{macro}{\ifgrep@outopen}
  1960. % and flags for the same 
  1961. %    \begin{macrocode}
  1962. \newif\ifgrep@cont
  1963. \newif\ifgrep@outopen
  1964. %    \end{macrocode}
  1965. %   \end{macro}
  1966. % \end{macro}
  1967. % \begin{macro}{\grep@aline}
  1968. % Examine one line and set the variables |\grep@tag| and |\grep@val|
  1969. % iff the line starts with a colon.  Subtle point here: |\ifx#1:| will
  1970. % \emph{not} work if |#1| starts with a |{| followed by two identical
  1971. % characters.
  1972. %    \begin{macrocode}
  1973. \def\grep@aline#1#2\sentinel{%
  1974.   \ifx:#1%
  1975.     \grep@splitlbuf#2\sentinel
  1976.   \else
  1977.     \edef\grep@tag{\csname*grep*\endcsname}%
  1978.     \def\grep@val{}%
  1979.   \fi}
  1980. %    \end{macrocode}
  1981. % \end{macro}
  1982. % \begin{macro}{\grep@splitlbuf}
  1983. % Split the line buffer at the remaining colon, hashing the first part.
  1984. %    \begin{macrocode}
  1985. \def\grep@splitlbuf#1:#2\sentinel{%
  1986.   \edef\grep@tag{\csname*grep*#1*\endcsname}%
  1987.   \def\grep@val{#2}}
  1988. %</!mp>
  1989. %    \end{macrocode}
  1990. % \end{macro}
  1991. % The other \TeX{} command sequences are defined below, along with the
  1992. % \MF{} macros they are in one-to-one correspondence to.
  1993. %    \begin{macrocode}
  1994. %</style>
  1995. %    \end{macrocode}
  1996. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1997. % \section{\MF{} macros}
  1998. % \label{sec:mf-code}
  1999. % Now we turn our attention to the \MF{}
  2000. % macros.
  2001. % \begin{dubious}
  2002. %   We should find a way (a hack) to index the
  2003. %   \MF{} macros with the |doc| option.
  2004. % \end{dubious}
  2005. % Because to name clashes, \FMF{} will not work if the |cmbase| is
  2006. % loaded.  Die with an useful error message:
  2007. % \changes{1.5}{1994/06/13}{Don't accept the Computer Modern Base.}
  2008. %    \begin{macrocode}
  2009. %<*base>
  2010. if known cmbase:
  2011.   errhelp
  2012.     "feynmf will only work with plain Metafont, as described in the book.";
  2013.   errmessage "feynmf: CMBASE detected.  Please use the PLAIN base.";
  2014.   forever:
  2015.     errmessage "No use in trying!  You'd better eXit now ...";
  2016.     errorstopmode;
  2017.   endfor
  2018. %    \end{macrocode}
  2019. % Make the RCS revision number available for feature testing:
  2020. % \changes{1.1}{1994/05/20}{%
  2021. %   Handle arbitrary RCS revision strings.}
  2022. %    \begin{macrocode}
  2023. vardef parse_RCS (suffix RCS) (expr s) =
  2024.   save n, c;
  2025.   numeric n, RCS[];
  2026.   string c;
  2027.   RCS[0] := 0;
  2028.   for n = 1 upto length (s):
  2029.     c := substring (n-1,n) of s;
  2030.     exitif ((RCS[0] > 0) and (c = " "));
  2031.     if ((c = "0") or (c = "1") or (c = "2")
  2032.         or (c = "3") or (c = "4") or (c = "5")
  2033.         or (c = "6") or (c = "7") or (c = "8")
  2034.         or (c = "9")):
  2035.       if RCS[0] = 0:
  2036.         RCS[0] := 1;
  2037.         RCS[RCS[0]] := 0;
  2038.       fi
  2039.       RCS[RCS[0]] := 10 * RCS[RCS[0]] + scantokens (c);
  2040.     elseif c = ".":
  2041.       RCS[0] := RCS[0] + 1;
  2042.       RCS[RCS[0]] := 0;
  2043.     else:
  2044.     fi
  2045.   endfor
  2046. enddef;
  2047. %    \end{macrocode}
  2048. % Check that \LaTeX{} style and \MF{} macros are in sync:
  2049. %    \begin{macrocode}
  2050. vardef require_RCS_revision expr s =
  2051.   save n, TeX_rev, mf_rev;
  2052.   numeric n;
  2053.   parse_RCS (TeX_rev, s);
  2054.   parse_RCS (mf_rev, "1.10");
  2055.   for n = 1 upto min (2, TeX_rev[0], mf_rev[0]):
  2056.     if TeX_rev[n] > mf_rev[n]:
  2057.       errhelp
  2058.         "Your version of `feynmf.sty' is higher that of your `feynmf.mf'.";
  2059.       errmessage "feynmf: Metafont macros out of date";
  2060.     elseif TeX_rev[n] < mf_rev[n]:
  2061.       errhelp
  2062.         "Your version of `feynmf.mf' is higher that of your `feynmf.sty'.";
  2063.       errmessage "feynmf: LaTeX style out of date";
  2064.     fi
  2065.     exitif (TeX_rev[n] <> mf_rev[n]);
  2066.   endfor
  2067. enddef;
  2068. %    \end{macrocode}
  2069. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2070. % \subsection{\MP{} Kludges}
  2071. % This \MP{} support is still kludgey, but it works and we're trying
  2072. % to prove a point.
  2073. % \changes{1.4}{1994/05/27}{Preliminary \MP{} support: mimic \MF.}
  2074. %    \begin{macrocode}
  2075. %<*mp>
  2076. vardef cullit = \ enddef;
  2077. %    \end{macrocode}
  2078. %    \begin{macrocode}
  2079. vardef beginchar (expr c, wd, ht, dp) =
  2080.   LaTeX_file := "";
  2081.   beginfig(c);
  2082.     w:=wd;
  2083.     h:=ht;
  2084. enddef;
  2085. string LaTeX_file;
  2086. %    \end{macrocode}
  2087. %    \begin{macrocode}
  2088. vardef endchar =
  2089.   setbounds currentpicture to (0,0)--(w,0)--(w,h)--(0,h)--cycle;
  2090.   if LaTeX_file <> "":
  2091.     write EOF to LaTeX_file;
  2092.     LaTeX_file := "";
  2093.   endfig
  2094. enddef;
  2095. %    \end{macrocode}
  2096. % Sharped dimensions are useless with \MP.  We define them anyway
  2097. % with trivial translation, so that the \MF{} code can be used
  2098. % unchanged.
  2099. %    \begin{macrocode}
  2100. bp# := bp;
  2101. cc# := cc;
  2102. cm# := cm;
  2103. dd# := dd;
  2104. in# := in;
  2105. mm# := mm;
  2106. pc# := pc;
  2107. pt# := pt;
  2108. %    \end{macrocode}
  2109. % As I said: trivial translation.
  2110. %    \begin{macrocode}
  2111. vardef define_blacker_pixels(text t) =
  2112.   forsuffixes $=t:
  2113.     $:=$.#;
  2114.   endfor
  2115. enddef;
  2116. %</mp>
  2117. %    \end{macrocode}
  2118. %    \begin{macrocode}
  2119. %<!mp>mode_setup;
  2120. %    \end{macrocode}
  2121. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2122. % \subsection{Basics}
  2123. % \label{sec:mf-basics}
  2124. % Allow the user to life dangerously or not, depending on his
  2125. % preferences.
  2126. % \changes{1.7}{1994/10/23}{\texttt{fmfwizard}: to live dangerously or not.}
  2127. %    \begin{macrocode}
  2128. boolean feynmfwizard;
  2129. feynmfwizard := false;
  2130. %</base>
  2131. %    \end{macrocode}
  2132. % \begin{macro}{\fmfwizard}
  2133. %   \begin{macro}{\fmfnowizard}
  2134. %    \begin{macrocode}
  2135. %<*style>
  2136. \def\fmfwizard{\fmfcmd{feynmfwizard := true;}}
  2137. \def\fmfnowizard{\fmfcmd{feynmfwizard := false;}}
  2138. %</style>
  2139. %    \end{macrocode}
  2140. %   \end{macro}
  2141. % \end{macro}
  2142. % Default values of style parameters:
  2143. %    \begin{macrocode}
  2144. %<*base>
  2145. thin#:=1pt#; % dimension of the lines
  2146. thick#:=2thin#;
  2147. arrow_len# := 4mm#;
  2148. arrow_ang := 15;
  2149. curly_len#:=3mm#;
  2150. dash_len#:=3mm#; % 'photon' lines
  2151. dot_len#:=2mm#; % 'photon' lines
  2152. wiggly_len#:=4mm#; % 'photon' lines
  2153. wiggly_slope:=60;
  2154. shade_black#:=1pt#; % shading
  2155. shade_white#:=2shade_black#;
  2156. shade_angle:=60;
  2157. decor_size#:=5mm#;
  2158. dot_size#:=2thick#;
  2159. %    \end{macrocode}
  2160. % Convert ``sharp'' units:
  2161. %    \begin{macrocode}
  2162. define_blacker_pixels (thick, thin, shade_black, shade_white,
  2163.   dash_len, dot_len, wiggly_len, curly_len, arrow_len,
  2164.   decor_size, dot_size);
  2165. %    \end{macrocode}
  2166. % Back by popular demand: shrinking dimensions.
  2167. % \changes{1.5}{1994/06/13}{%
  2168. %   Back by popular demand: shrinking dimensions.}
  2169. %    \begin{macrocode}
  2170. def shrink expr s =
  2171.   begingroup
  2172.   if shrinkables <> "":
  2173.     save tmp_;
  2174.     forsuffixes $ = scantokens shrinkables:
  2175.       tmp_ := $.#;
  2176.       save $;
  2177.       $.# := s * tmp_;
  2178.     endfor
  2179.     define_blacker_pixels (scantokens shrinkables);
  2180. enddef;
  2181. %    \end{macrocode}
  2182. %    \begin{macrocode}
  2183. def endshrink =
  2184.   endgroup
  2185. enddef;
  2186. %</base>
  2187. %    \end{macrocode}
  2188. % \begin{macro}{\fmfshrink}
  2189. %   \begin{macro}{\endfmfshrink}
  2190. % Exporting the whole enchilada to \LaTeX:
  2191. %    \begin{macrocode}
  2192. %<*style>
  2193. \def\fmfshrink#1{\fmfcmd{shrink (#1);}}
  2194. \def\endfmfshrink{\fmfcmd{endshrink;}}
  2195. %</style>
  2196. %    \end{macrocode}
  2197. %   \end{macro}
  2198. % \end{macro}
  2199. %    \begin {macrocode}
  2200. %<*base>
  2201. string shrinkables;
  2202. shrinkables := "";
  2203. %    \end{macrocode}
  2204. % This macro is used to register shrinkable dimensions.  It is not
  2205. % really robust, we have add the first enty by hand:
  2206. %    \begin {macrocode}
  2207. vardef addto_shrinkables (text l) =
  2208.   forsuffixes $ = l:
  2209.     shrinkables := shrinkables & "," & str $;
  2210.   endfor
  2211. enddef;
  2212. shrinkables := "thick,thin";
  2213. %    \end{macrocode}
  2214. %    \begin {macrocode}
  2215. addto_shrinkables (shade_black, shade_white);
  2216. addto_shrinkables (dash_len, dot_len);
  2217. addto_shrinkables (wiggly_len, curly_len);
  2218. addto_shrinkables (arrow_len);
  2219. addto_shrinkables (decor_size, dot_size);
  2220. %    \end{macrocode}
  2221. % Default to metric units, but this will be reset by |\begin{fmfchar}|
  2222. % anyway.
  2223. %    \begin {macrocode}
  2224. LaTeX_unitlength := mm;
  2225. %    \end{macrocode}
  2226. % Count the number of tokens in the argument:
  2227. %    \begin {macrocode}
  2228. vardef count (text list) =
  2229.   forsuffixes $ = list: + 1 endfor
  2230. enddef;
  2231. %    \end{macrocode}
  2232. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2233. % \subsection{Parsing options}
  2234. % \label{sec:getopt}
  2235. % Parse the string |s| into comma separated tokens |opt[]|, ignoring
  2236. % blanks before |=|'s. Double commas are passed as a single comma.
  2237. % \changes{1.9}{1994/10/25}{%
  2238. %   Plugged the string memory leak in \texttt{getopt}: don't create
  2239. %   intermediate one character strings, \MF{} never claims them back.}
  2240. %    \begin {macrocode}
  2241. vardef getopt (suffix opt) (expr s) =
  2242.   save n, argp, escape, anchor, skip;
  2243.   numeric opt.first, opt.last, n, anchor;
  2244.   string opt[], opt[]arg;
  2245.   boolean opt[]tainted, argp, escape, skip;
  2246.   opt.first := 0;
  2247.   opt.last := 0;
  2248.   opt[opt.last] := "";
  2249.   argp := false;
  2250.   escape := false;
  2251.   anchor := 0;
  2252.   skip := true;
  2253.   for n = 1 upto length (s):
  2254. %    \end{macrocode}
  2255. % Skip blanks at the beginning of each option or argument:
  2256. %    \begin {macrocode}
  2257.     if skip and (substring (n-1, n) of s = " "):
  2258.       anchor := anchor + 1;
  2259.     else:
  2260.       skip := false;
  2261. %    \end{macrocode}
  2262. % If we see a comma which has not been escaped, check for a second
  2263. % comma and set the |escape| flags and remember to remove the second
  2264. % comma later or reset the |argp| flag, as appropriate:
  2265. %    \begin {macrocode}
  2266.       if not escape and (substring (n-1, n) of s = ","):
  2267.         if substring (n, n+1) of s = ",":
  2268.           escape := true;
  2269.           opt[opt.last]tainted := true;
  2270. %    \end{macrocode}
  2271. % Else accept the option or argument:
  2272. %    \begin {macrocode}
  2273.         else:
  2274.           if argp:
  2275.             opt[opt.last]arg := substring (anchor, n-1) of s;
  2276.           else:
  2277.             opt[opt.last] := substring (anchor, n-1) of s;
  2278.           fi
  2279.           anchor := n;
  2280.           argp := false;
  2281.           skip := true;
  2282.           opt.last := opt.last + 1;
  2283.         fi
  2284. %    \end{macrocode}
  2285. % Start as argument and ignore |=|'s until the next option:
  2286. %    \begin {macrocode}
  2287.       elseif not argp and (substring (n-1, n) of s = "="):
  2288.         opt[opt.last] := substring (anchor, n-1) of s;
  2289.         anchor := n;
  2290.         argp := true;
  2291.         skip := true;
  2292. %    \end{macrocode}
  2293. % Accept the next character (either option or argument) and reset the
  2294. % |escape| flag:
  2295. %    \begin {macrocode}
  2296.       elseif argp or (substring (n-1, n) of s <> " "):
  2297.         escape := false;
  2298.       fi
  2299.     fi
  2300.   endfor
  2301. %    \end{macrocode}
  2302. % Accept the final option or argument:
  2303. %    \begin {macrocode}
  2304.   if argp:
  2305.     opt[opt.last]arg := substring (anchor, length s) of s;
  2306.   else:
  2307.     opt[opt.last] := substring (anchor, length s) of s;
  2308. %    \end{macrocode}
  2309. % We still have to remove possible doubled commata from the arguments.
  2310. % Theoretically, we could already have done it above (that's the way
  2311. % earlier versions of \FMF{} did it), but only at the expense of
  2312. % excessive copying of strings (like |opt[n]arg:=opt[n]arg&c|).  Given
  2313. % \MF's string handling, we should avoid these \emph{at any cost},
  2314. % because the wasted string memory will \emph{never} be
  2315. % reclaimed!\footnote{Actually, \MP{} has code to compact the string
  2316. %   pool, which  makes \emph{a lot} of difference in the present case.
  2317. %   But this doesn't help us with \MF.}
  2318. % Since the more elegant former version had a serious string memory
  2319. % leak, we'd better stick to the current ugly but space efficient
  2320. % implementation.
  2321. %    \begin {macrocode}
  2322.   for n = opt.first upto opt.last:
  2323.     if known opt[n]tainted:
  2324.       if opt[n]tainted:
  2325.         opt[n]arg := untaint_string opt[n]arg;
  2326.       fi
  2327.     fi
  2328.   endfor
  2329. enddef;
  2330. %    \end{macrocode}
  2331. % Turn double commata into single commata, using as little string
  2332. % copies as possible:
  2333. %    \begin {macrocode}
  2334. vardef untaint_string suffix s =
  2335.   save n, anchor;
  2336.   numeric n, anchor;
  2337.   anchor := 0;
  2338.   for n = 1 upto length (s) - 1:
  2339.     if substring (n-1,n+1) of s = ",,":
  2340.       substring (anchor, n-1) of s &
  2341.       hide (anchor := n)
  2342.     fi
  2343.   endfor
  2344.   substring (anchor, length s) of s
  2345. enddef;
  2346. %    \end{macrocode}
  2347. % Split a string into |.|-separated components for matching options.
  2348. %    \begin {macrocode}
  2349. vardef split_string (suffix comp) (expr s) =
  2350.   save n, anchor;
  2351.   numeric comp.first, comp.last, n, anchor;
  2352.   string comp[];
  2353.   comp.first := 0;
  2354.   comp.last := 0;
  2355.   comp[comp.last] := "";
  2356.   anchor := 0;
  2357.   for n = 1 upto length (s):
  2358.     if substring (n-1,n) of s = ".":
  2359.       comp[comp.last] := substring (anchor, n-1) of s;
  2360.       comp.last := comp.last + 1;
  2361.       anchor := n;
  2362.     fi
  2363.   endfor
  2364.   comp[comp.last] := substring (anchor, length s) of s;
  2365. enddef;
  2366. %    \end{macrocode}
  2367. % Return |true| iff |prefix| is a prefix of |s|:
  2368. %    \begin {macrocode}
  2369. vardef match_prefix (expr prefix, s) =
  2370.   (prefix = substring (0, length prefix) of s)
  2371. enddef;
  2372. %    \end{macrocode}
  2373. % Match options similarly to |Xt| resource strings, but allowing for
  2374. % abbreviations:
  2375. % \changes{1.7}{1994/10/23}{More general option parsing.}
  2376. %    \begin {macrocode}
  2377. vardef match_option (expr s, option) =
  2378.   save sc, optionc, n, i;
  2379.   numeric sc.first, sc.last, optionc.first, optionc.last;
  2380.   string sc[], optionc[];
  2381.   numeric n, i;
  2382.   split_string (sc, s);
  2383.   split_string (optionc, option);
  2384.   n := sc.last - sc.first;
  2385.   if n <> (optionc.last - optionc.first):
  2386.     false
  2387.   else:
  2388.     true
  2389.     for i = 0 upto n:
  2390.       and match_prefix (sc[sc.first+i],
  2391.                         optionc[optionc.first+i])
  2392.     endfor
  2393. enddef;
  2394. %    \end{macrocode}
  2395. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2396. % \subsection{Manipulating \texttt{picture}s}
  2397. % \label{sec:pictures}
  2398. % |save_picture (list_of_pictures)| |save|'s each member of
  2399. % |list_of_pictures| inside a group and reinitializes them as nullpictures.
  2400. %    \begin{macrocode}
  2401. def save_picture text t =
  2402.  save t; picture t; forsuffixes p=t: p:=nullpicture; endfor
  2403. enddef;
  2404. %    \end{macrocode}
  2405. % |begin_sketch| pushes the sketchpad stack and perform the following
  2406. % drawing commands (upto the next |end_sketch|) on the new sketchpad.
  2407. %    \begin{macrocode}
  2408. def begin_sketch =
  2409.  begingroup save_picture currentpicture;
  2410.  sketchlevel := sketchlevel+1;
  2411. enddef;
  2412. %    \end{macrocode}
  2413. % |end_sketch| pops the sketchpad stack.
  2414. %    \begin{macrocode}
  2415. def end_sketch =
  2416.  sketchlevel := sketchlevel-1;
  2417.  sketchpad[sketchlevel] := currentpicture;
  2418.  endgroup
  2419. enddef;
  2420. %    \end{macrocode}
  2421. %    \begin{macrocode}
  2422. picture sketchpad[];
  2423. sketchlevel := 1;
  2424. %    \end{macrocode}
  2425. % |use_sketch (transformation)| copies the transformed sketchpad into
  2426. % the current picture.
  2427. %    \begin{macrocode}
  2428. vardef use_sketch text t =
  2429.  addto currentpicture also (sketchpad[sketchlevel] t)
  2430. enddef;
  2431. %    \end{macrocode}
  2432. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2433. % \subsection{Shading}
  2434. % \label{sec:shading}
  2435. % |shade (path_arg)| shades the interior of |path_arg|.  This shading is
  2436. % controlled by the global variables |shade_black|, |shade_white|, and
  2437. % |shade_angle|.
  2438. % Caveat:  The procedure is only guaranteed to work for convex paths.
  2439. % \begin{dubious}
  2440. %   \MP{} has nice primitives to aid in finding bounding boxes, in
  2441. %   \MF{} we have to rely on heuristics.
  2442. % \end{dubious}
  2443. %    \begin{macrocode}
  2444. vardef shade expr p_arg =
  2445.  save x,y,d,p,currentpen; path p; pen currentpen;    % push pen!
  2446.  pickup pencircle scaled shade_black;
  2447.  p = p_arg rotated - shade_angle;  % calculate enclosing rectangle
  2448.  x2' = x3' = xpart directionpoint up of p; % (rotated by |shade_angle|).
  2449.  x1' = x4' = xpart directionpoint down of p;
  2450.  y1' = y2' = ypart directionpoint right of p;
  2451.  y3' = y4' = ypart directionpoint left of p;
  2452.  forsuffixes $=1,2,3,4: z$ = z$' rotated shade_angle; endfor
  2453.  d = abs(z1-z4); % height.
  2454.  begin_sketch % fill rectangle with lines.
  2455.   for k=shade_white/d step (shade_white+shade_black)/d
  2456.     until 1 - shade_white/d:
  2457.    cutdraw k[z1,z4] -- k[z2,z3];
  2458.   endfor
  2459. %    \end{macrocode}
  2460. % \MF{} has no clipping operation, but since we know the bounding box,
  2461. % we can use \MF's pixel arithmetic for calculating the set
  2462. % theoretical intersection of the interior of |p_arg| and the diagonal
  2463. % lines in the bounding box:
  2464. %    \begin{macrocode}
  2465. %<*!mp>
  2466.   cullit;
  2467.   fill p_arg;
  2468.   unfill z1--z2--z3--z4--cycle;
  2469.   cullit;
  2470. %</!mp>
  2471. %    \end{macrocode}
  2472. % \MP{} has clipping build in but no pixel arithmetic:
  2473. % \changes{1.4}{1994/05/28}{\MP{} support: shading.}
  2474. %    \begin{macrocode}
  2475. %<*mp>
  2476.   clip currentpicture to p_arg;
  2477. %</mp>
  2478.  end_sketch;
  2479.  use_sketch;
  2480. enddef;
  2481. %    \end{macrocode}
  2482. % Hatching is implemented as double shading.
  2483. % \changes{1.7}{1994/10/22}{Hatched vertices.}
  2484. %    \begin{macrocode}
  2485. vardef hatch expr p =
  2486.   shade p;
  2487.   save a;
  2488.   a = shade_angle;
  2489.   save shade_angle;
  2490.   shade_angle = a + 90;
  2491.   shade p;
  2492. enddef;
  2493. %    \end{macrocode}
  2494. % |filldraw|'s sisters:
  2495. %    \begin{macrocode}
  2496. vardef shadedraw expr p =
  2497.   shade p;
  2498.   draw p;
  2499. enddef;
  2500. vardef hatchdraw expr p =
  2501.   hatch p;
  2502.   draw p;
  2503. enddef;
  2504. %    \end{macrocode}
  2505. % John Hobby has a particulary nice |arrowhead| macro in plain \MP.  A
  2506. % variation on that theme adapted to our needs is:
  2507. % \changes{1.5}{1994/10/20}{New arrows, which look better on curved arcs.}
  2508. %    \begin{macrocode}
  2509. vardef arrow expr p =
  2510.   save t, a, z_, ap_, tip;
  2511.   numeric t[], a;
  2512.   pair z_, tip;
  2513.   path ap_;
  2514.   a = angle direction .5 length(p) of p;
  2515.   z_ = point .5 length(p) of p;
  2516.   (t1,whatever) = p intersectiontimes
  2517.     (halfcircle scaled 2/3arrow_len rotated (a+90) shifted z_);
  2518.   (t2,whatever) = p intersectiontimes
  2519.     (halfcircle scaled 4/3arrow_len rotated (a-90) shifted z_);
  2520. %    \end{macrocode}
  2521. % |intersectiontimes| can fail, typically if the path is too short:
  2522. % protect against it
  2523. % \changes{1.6}{1994/10/21}{Fix arrows on too short arcs.}
  2524. %    \begin{macrocode}
  2525.   if t1 = -1: t1 := 0; fi
  2526.   if t2 = -1: t2 := length p; fi
  2527.   tip = point t2 of p;
  2528.   ap_ = subpath (t1,t2) of p shifted -tip;
  2529.   (ap_ rotated arrow_ang
  2530.     forced_join reverse ap_ rotated -arrow_ang
  2531.     -- cycle) shifted tip
  2532. enddef;
  2533. %    \end{macrocode}
  2534. % Join two paths |p| and |q| even if they don't fit exactly by
  2535. % adjusting their common point.  This is necessary in |arrow| because
  2536. % rounding errors might induce a small mismatch even if we \emph{know}
  2537. % that they should match theoretically.  This is certainly a kludge
  2538. % and should be used with care, but it works.
  2539. %    \begin{macrocode}
  2540. tertiarydef p forced_join q =
  2541.   subpath (0, length p - 1) of p
  2542.   & point (length p - 1) of p
  2543.     .. controls postcontrol (length p - 1) of p
  2544.                 and precontrol infinity of p
  2545.   .. .5[point infinity of p, point 0 of q]
  2546.     .. controls postcontrol 0 of q and precontrol 1 of q
  2547.     .. point 1 of q
  2548.   & subpath (1, infinity) of q
  2549. enddef;
  2550. %    \end{macrocode}
  2551. % |cut_decors| expands to a subpath of |path_arg|, excluding the
  2552. % decoration at the vertices.
  2553. % \changes{1.7}{1994/10/22}{Cut general vertex decorations.}
  2554. %    \begin{macrocode}
  2555. vardef cut_decors (suffix from) (expr p) (suffix to) =
  2556.  subpath (if known from.decor.shape:
  2557.             xpart (p intersectiontimes
  2558.                      (from.decor.shape scaled from.decor.size
  2559.                                        shifted from.loc))
  2560.           else:
  2561.             0
  2562.           fi,
  2563.           if known to.decor.shape:
  2564.             xpart (p intersectiontimes
  2565.                      (to.decor.shape scaled to.decor.size
  2566.                                      shifted to.loc))
  2567.          else:
  2568.             infinity
  2569.          fi) of p
  2570. enddef;
  2571. %    \end{macrocode}
  2572. % The function |make_blob| is the working horse of |draw_blob|.
  2573. %    \begin{macrocode}
  2574. vardef make_blob (expr z_arg, diameter) =
  2575.  save p,currentpen; path p; pen currentpen;
  2576.  pickup pencircle scaled thick;
  2577.  p = fullcircle scaled diameter shifted z_arg;
  2578.  shadedraw p;
  2579. enddef;
  2580. %    \end{macrocode}
  2581. % |draw_blob (pair_arg, diameter)| draws a shaded blob of diameter
  2582. % |diameter| centered at |pair_arg|. The thickness of the border is
  2583. % controlled by the global variable |thick|.
  2584. % Hint: It saves time to draw blobs of the same size in sequence.
  2585. %    \begin{macrocode}
  2586. vardef draw_blob (expr z_arg, diameter) =
  2587.  if sketched_blob_diameter <> diameter: % drawn lately?
  2588.   begin_sketch make_blob (origin, diameter); end_sketch; % redo hard work!
  2589.   sketched_blob_diameter:= diameter;  % record it
  2590.  use_sketch shifted z_arg; % the easy way ...
  2591. enddef;
  2592. %    \end{macrocode}
  2593. % |force_new_blob| forces the redrawing of a blob of the same diameter
  2594. % (in case you only changed the shading parameters).
  2595. %    \begin{macrocode}
  2596. def force_new_blob = sketched_blob_diameter := -1; enddef;
  2597. force_new_blob;                                 % initialize it.
  2598. %    \end{macrocode}
  2599. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2600. % \subsection{Drawing}
  2601. % \label{sec:drawing}
  2602. % Easier than
  2603. % \begin{equation}
  2604. %   \int_0^1 dt \left\vert\frac{dx(t)}{dt}\right\vert
  2605. % \end{equation}
  2606. % with the integrand the square root of a fourth order polynomial, but
  2607. % sufficient for all practical purposes is
  2608. %    \begin{macrocode}
  2609. vardef pixlen (expr p, n) =
  2610.   for k=1 upto length(p): + segment_pixlen (subpath (k-1,k) of p, n) endfor
  2611. enddef;
  2612. %    \end{macrocode}
  2613. %    \begin{macrocode}
  2614. vardef segment_pixlen (expr p, n) =
  2615.   for k=1 upto n: + abs (point k/n of p - point (k-1)/n of p) endfor
  2616. enddef;
  2617. %    \end{macrocode}
  2618. % |wiggly (path_arg)| expands to a ``wiggled'' version of |path_arg|. The
  2619. % slope of the wiggles is controlled by the global variable |wiggle_slope|,
  2620. % the length of the wiggles by the global variable |wiggly_len|.
  2621. %    \begin{macrocode}
  2622. vardef wiggly expr p_arg =
  2623.  save wpp;
  2624.  numeric wpp;
  2625.  wpp = ceiling (pixlen (p_arg, 10) / (wiggly_len * length(p_arg)));
  2626.  for k=0 upto wpp*length(p_arg) - 1:
  2627.   point k/wpp of p_arg
  2628.        {direction k/wpp of p_arg rotated wiggly_slope} ..
  2629.   point (k+.5)/wpp of p_arg
  2630.        {direction (k+.5)/wpp of p_arg rotated - wiggly_slope} ..
  2631.  endfor
  2632.  if cycle p_arg: cycle else: point infinity of p_arg fi
  2633. enddef;
  2634. %    \end{macrocode}
  2635. % |curly (path_arg)| expands to a ``curly'' version of |path_arg|. The
  2636. % the length of the curls is controlled  by the global variable
  2637. % |curly_len|.
  2638. %    \begin{macrocode}
  2639. vardef curly expr p_arg =
  2640.  save cpp;
  2641.  numeric cpp;
  2642.  cpp = ceiling (pixlen (p_arg, 10) / (curly_len * length(p_arg)));
  2643.  if cycle p_arg:
  2644.    for k=0 upto cpp*length(p_arg) - 1:
  2645.      point (k+.33)/cpp of p_arg
  2646.            {direction (k+.33)/cpp of p_arg rotated 90} ..
  2647.      point (k-.33)/cpp of p_arg
  2648.            {direction (k-.33)/cpp of p_arg rotated -90} ..
  2649.    endfor
  2650.    cycle
  2651.  else:
  2652.    point 0 of p_arg
  2653.          {direction 0 of p_arg rotated -90} ..
  2654.    for k=1 upto cpp*length(p_arg) - 1:
  2655.      point (k+.33)/cpp of p_arg
  2656.            {direction (k+.33)/cpp of p_arg rotated 90} ..
  2657.      point (k-.33)/cpp of p_arg
  2658.            {direction (k-.33)/cpp of p_arg rotated -90} ..
  2659.    endfor
  2660.    point infinity of p_arg
  2661.          {direction infinity of p_arg rotated 90}
  2662. enddef;
  2663. %    \end{macrocode}
  2664. % An inventory of valid line styles is implemented as a hash table:
  2665. %    \begin{macrocode}
  2666. save vsty_hash;
  2667. %    \end{macrocode}
  2668. % This is a bit like |mode_def| in plain \MF{} but doesn't use an
  2669. % array of available modes: |style_def "foo"| will define a macro
  2670. % |draw_foo| drawing a line of a certain style along any given path:
  2671. %    \begin{macrocode}
  2672. def style_def suffix s =
  2673.   vsty_hash.s := 1;
  2674.   expandafter quote vardef scantokens ("draw_" & str s)
  2675. enddef;
  2676. %    \end{macrocode}
  2677. % Let \MF{} do the lookup: suffices
  2678. %    \begin{macrocode}
  2679. vardef vsty_exists suffix s =
  2680.   known vsty_hash.s
  2681. enddef;
  2682. %    \end{macrocode}
  2683. % an strings
  2684. %    \begin{macrocode}
  2685. vardef valid_style expr s =
  2686.   expandafter vsty_exists scantokens (s)
  2687. enddef;
  2688. %    \end{macrocode}
  2689. % \changes{1.9}{1994/11/21}{Enhance and streamline the line styles.}
  2690. % |phantom| lines are simple, even with arrows.
  2691. %    \begin{macrocode}
  2692. style_def phantom expr p =
  2693. enddef;
  2694. style_def phantom_arrow expr p =
  2695.   fill (arrow p);
  2696. enddef;
  2697. %    \end{macrocode}
  2698. % |plain| lines aren't harder.
  2699. %    \begin{macrocode}
  2700. style_def plain expr p =
  2701.   draw p;
  2702. enddef;
  2703. style_def plain_arrow expr p =
  2704.   draw p;
  2705.   fill (arrow p);
  2706. enddef;
  2707. style_def dbl_plain expr p =
  2708.   draw_double p;
  2709. enddef;
  2710. style_def dbl_plain_arrow expr p =
  2711.   draw_double_arrow p;
  2712. enddef;
  2713. %    \end{macrocode}
  2714. % Wiggly lines use |wiggly| from above
  2715. %    \begin{macrocode}
  2716. style_def wiggly expr p =
  2717.   draw (wiggly p);
  2718. enddef;
  2719. style_def dbl_wiggly expr p =
  2720.   draw_double (wiggly p);
  2721. enddef;
  2722. %    \end{macrocode}
  2723. % and curly lines use |curly| from above
  2724. %    \begin{macrocode}
  2725. style_def curly expr p =
  2726.   draw (curly p);
  2727. enddef;
  2728. style_def dbl_curly expr p =
  2729.   draw_double (curly p);
  2730. enddef;
  2731. %    \end{macrocode}
  2732. % |draw_dashes (p)| draws a dashed line on |p|
  2733. % \changes{1.4}{1994/05/27}{%
  2734. %   Rename the line style \texttt{dashed} to \texttt{dashes}, to avoid
  2735. %   a name clash with \MP.}
  2736. %    \begin{macrocode}
  2737. style_def dashes expr p_arg =
  2738.  save dpp;
  2739.  numeric dpp;
  2740.  dpp = ceiling (pixlen (p_arg, 10) / (dash_len * length(p_arg)));
  2741.  for k=0 upto dpp*length(p_arg) - 1:
  2742.   draw point k/dpp of p_arg ..
  2743.    point (k+.5)/dpp of p_arg;
  2744.  endfor
  2745. enddef;
  2746. style_def dbl_dashes expr p =
  2747.  save dpp;
  2748.  numeric dpp;
  2749.  dpp = ceiling (pixlen (p, 10) / (dash_len * length(p)));
  2750.  for k=0 upto dpp*length(p) - 1:
  2751.   draw_double point k/dpp of p ..
  2752.    point (k+.5)/dpp of p;
  2753.  endfor
  2754. enddef;
  2755. style_def dbl_dashes_arrow expr p =
  2756.   draw_dbl_dashes p;
  2757.   fill (arrow p);
  2758. enddef;
  2759. style_def dashes_arrow expr p =
  2760.   draw_dashes p;
  2761.   fill (arrow p);
  2762. enddef;
  2763. %    \end{macrocode}
  2764. % |draw_dots (expr p_arg)| draws a dotted line on |path_arg|
  2765. % \changes{1.4}{1994/05/27}{%
  2766. %   Rename the line style \texttt{dotted} to \texttt{dots}, to be
  2767. %   consistent with \texttt{dashes}.}
  2768. %    \begin{macrocode}
  2769. style_def dots expr p_arg =
  2770.  save dpp;
  2771.  numeric dpp;
  2772.  dpp = ceiling (pixlen (p_arg, 10) / (dot_len * length(p_arg)));
  2773.  for k=0 upto dpp*length(p_arg):
  2774.   drawdot point k/dpp of p_arg;
  2775.  endfor
  2776. enddef;
  2777. style_def dbl_dots expr p_arg =
  2778.   save dpp;
  2779.   numeric dpp;
  2780.   dpp = ceiling (pixlen (p_arg, 10) / (dot_len * length(p_arg)));
  2781.   begingroup
  2782.     pen oldpen;
  2783.     oldpen := currentpen;
  2784.     pickup oldpen scaled 3; % draw a thick linn
  2785.     for k=0 upto dpp*length(p_arg):
  2786.       drawdot point k/dpp of p_arg;
  2787.     endfor
  2788.     pickup oldpen;
  2789.     cullit;
  2790.     for k=0 upto dpp*length(p_arg):
  2791.       undrawdot point k/dpp of p_arg;
  2792.     endfor
  2793.     cullit; % and remove the stuffing
  2794.   endgroup;
  2795. enddef;
  2796. style_def dbl_dots_arrow expr p =
  2797.   draw_dbl_dots p;
  2798.   fill (arrow p);
  2799. enddef;
  2800. style_def dots_arrow expr p =
  2801.   draw_dots p;
  2802.   fill (arrow p);
  2803. enddef;
  2804. %    \end{macrocode}
  2805. % |draw_double (expr p_arg)| draws a double line.
  2806. %    \begin{macrocode}
  2807. style_def double expr p_arg =
  2808.   begingroup
  2809.     pen oldpen;
  2810.     oldpen := currentpen;
  2811.     pickup oldpen scaled 3; % draw a thick linn
  2812.     draw p_arg;
  2813.     pickup oldpen;
  2814.     cullit; undraw p_arg; cullit; % and remove the stuffing
  2815.   endgroup;
  2816. enddef;
  2817. style_def double_arrow expr p =
  2818.   draw_double p;
  2819.   fill (arrow p);
  2820. enddef;
  2821. %    \end{macrocode}
  2822. % Old aliases:
  2823. %    \begin{macrocode}
  2824. style_def vanilla expr p = draw_plain p enddef;
  2825. style_def fermion expr p = draw_plain_arrow p enddef;
  2826. style_def quark expr p = draw_plain_arrow p enddef;
  2827. style_def electron expr p = draw_plain_arrow p enddef;
  2828. style_def photon expr p = draw_wiggly p enddef;
  2829. style_def boson expr p = draw_wiggly p enddef;
  2830. style_def gluon expr p = draw_curly p enddef;
  2831. style_def heavy expr p = draw_dbl_plain_arrow p enddef;
  2832. style_def ghost expr p = draw_dots_arrow p enddef;
  2833. style_def scalar expr p = draw_dashes_arrow p enddef;
  2834. %    \end{macrocode}
  2835. % More old aliases:
  2836. %    \begin{macrocode}
  2837. vardef fermion expr path_arg =
  2838.   fill arrow (path_arg);
  2839.   path_arg
  2840. enddef;
  2841. vardef photon expr path_arg =
  2842.   wiggly path_arg
  2843. enddef;
  2844. vardef gluon expr path_arg =
  2845.   curly path_arg
  2846. enddef;
  2847. %    \end{macrocode}
  2848. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2849. % \subsection{Graphs of vertices}
  2850. % \label{sec:graphs}
  2851. % Here is the fun part of \FMF: \emph{automagic} placement of
  2852. % vertices.
  2853. %    \begin{macrocode}
  2854. %tracingmacros:=1;
  2855. %tracingonline:=1;
  2856. tracingstats:=1;
  2857. %    \end{macrocode}
  2858. % You can say |vtracing:=true| to see what's going on.
  2859. %    \begin{macrocode}
  2860. boolean vtracing;
  2861. vtracing := false; % true
  2862. %    \end{macrocode}
  2863. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2864. % \subsubsection{Data structures}
  2865. % \begin{table}
  2866. %   \begin{tabular}{lll}
  2867. %     Type      & Name          & Purpose \\\hline
  2868. %     |numeric| & |vlist.first| & pointer to first vertex (usually 1) \\
  2869. %     |numeric| & |vlist.last|  & pointer to last vertex (starts with 0) \\
  2870. %     |string|  & |vlist[|$i$|]name|          & symbolic name of the vertex\\
  2871. %     |pair|    & |vlist[|$i$|]loc|           & position of the vertex \\
  2872. %     |string|  & |vlist[|$i$|]lbl|           & label \\
  2873. %     |numeric| & |vlist[|$i$|]lbl.ang|       & angle \\
  2874. %     |numeric| & |vlist[|$i$|]lbl.dist|      & distance \\
  2875. %     |path|    & |vlist[|$i$|]decor.shape|   & shape of decoration\\
  2876. %     |numeric| & |vlist[|$i$|]decor.size|    & size of decoration\\
  2877. %     |numeric| & |vlist[|$i$|]decor.sty|     & filling style of decoration\\
  2878. %     |numeric| & |vlist[|$i$|]decor.ang|     & rotation angle\\
  2879. %     |numeric| & |vlist[|$i$|]arc.first|     & pointer to first arc \\
  2880. %     |numeric| & |vlist[|$i$|]arc.last|      & pointer to last arc \\
  2881. %     |numeric| & |vlist[|$i$|]arc[|$j$|]|    & $j$th arc of the $i$th vertex \\
  2882. %     |string|  & |vlist[|$i$|]arc[|$j$|]sty| & style of the arc\\
  2883. %     |numeric| & |vlist[|$i$|]arc[|$j$|]tns| & tension of the arc\\
  2884. %     |string|  & |vlist[|$i$|]arc[|$j$|]lsr| & left, straight, right\\
  2885. %     |string|  & |vlist[|$i$|]arc[|$j$|]lbl| & label\\
  2886. %     |string|  & |vlist[|$i$|]arc[|$j$|]lbl.side|& side of the label\\
  2887. %     |numeric| & |vlist[|$i$|]arc[|$j$|]lbl.dist|& distance of the label
  2888. %   \end{tabular}
  2889. %   \caption{Vertex data structure}
  2890. %   \label{tab:VDS}
  2891. % \end{table}
  2892. % The data structure for our graph is shown in
  2893. % table~\ref{tab:VDS}\footnote{%
  2894. %   \begin{dubious}
  2895. %     \texttt{boolean vlist[i]arc[j]smooth} will indicate that this
  2896. %     arc belongs to a set of arcs which are to be smoothly connected.
  2897. %     The implementation will start by going to the strt of this set,
  2898. %     define a long smooth path and finally do the drawing on the
  2899. %     various subpaths.
  2900. %   \end{dubious}}.
  2901. % \MF{} turns out to be quite powerful, providing such constructs
  2902. % in an unconventional, but flexible and concise way.  While we use
  2903. % |save vhash| to forget all previously defined vertices, we leave
  2904. % |vlist| alone, because we will know from $|vlist.last| <
  2905. % |vlist.first|$ that it's empty.  Note that we can't |vardef| this
  2906. % because then the |save| would go inside a group.
  2907. %    \begin{macrocode}
  2908. def vinit =
  2909.   save vhash;
  2910.   numeric vlist.first, vlist.last;
  2911.   vlist.first := 1;
  2912.   vlist.last := 0;
  2913.   pair vlist[]loc, lambda[][];
  2914.   numeric vlist[]decor.size, vlist[]decor.sty, vlist[]decor.ang,
  2915.     vlist[]arc.first, vlist[]arc.last,
  2916.     vlist[]arc[], vlist[]arc[]lsr,
  2917.     vlist[]arc[]tns, vlist[]arc[]lbl.dist,
  2918.     vlist[]constr.first, vlist[]constr.last,
  2919.     vlist[]constr[];
  2920.   string vlist[]name, vlist[]lbl,
  2921.     vlist[]arc[]sty, vlist[]arc[]lbl, vlist[]arc[]lbl.side;
  2922.   numeric vlist[]lbl.ang, vlist[]lbl.side;
  2923.   path vlist[]decor.shape;
  2924. enddef;
  2925. %</base>
  2926. %    \end{macrocode}
  2927. % \begin{macro}{\fmfinit}
  2928. % We can also ask for initialization explicitely from \TeX{} (usually
  2929. % it is called implicitely by |\begin{fmfchar}|).  This flushes the
  2930. % vertex table. 
  2931. %    \begin{macrocode}
  2932. %<style>\def\fmfinit{\fmfcmd{vinit;}}
  2933. %    \end{macrocode}
  2934. % \end{macro}
  2935. % Useful abstractions are: first for looping over all vertices
  2936. %    \begin{macrocode}
  2937. %<*base>
  2938. def vertices =
  2939.   vlist.first upto vlist.last
  2940. enddef;
  2941. %    \end{macrocode}
  2942. % second for looping over all arcs of vertex |i|
  2943. %    \begin{macrocode}
  2944. def varcs (text i) =
  2945.   vlist[i]arc.first upto vlist[i]arc.last
  2946. enddef;
  2947. %    \end{macrocode}
  2948. % and finally for looping over all constraints of vertex |i|
  2949. %    \begin{macrocode}
  2950. def vconstr (text i) =
  2951.   vlist[i]constr.first upto vlist[i]constr.last
  2952. enddef;
  2953. %    \end{macrocode}
  2954. % Entering vertices is simple, but note that we have to make
  2955. % |vlist[|$i$|]loc| undefined, because it might be around from an
  2956. % earlier character still.
  2957. %    \begin{macrocode}
  2958. vardef venter suffix v =
  2959.   if not vexists v:
  2960.     vlist.last := vlist.last + 1;
  2961.     vhash.v := vlist.last;
  2962.     vlist[vhash.v]name := str v;
  2963.     vlist[vhash.v]loc := (whatever,whatever);
  2964.     vlist[vhash.v]arc.first := 1;
  2965.     vlist[vhash.v]arc.last := 0;
  2966.     vlist[vhash.v]constr.first := 1;
  2967.     vlist[vhash.v]constr.last := 0;
  2968.     vlist[vhash.v]lbl := "";
  2969.     vlist[vhash.v]lbl.ang := whatever;
  2970.     vlist[vhash.v]lbl.dist := 3;
  2971. enddef;
  2972. %    \end{macrocode}
  2973. % The next three \emph{are} trivial. Existence
  2974. %    \begin{macrocode}
  2975. vardef vexists suffix v =
  2976.   if known vhash.v: true else: false fi
  2977. enddef;
  2978. %    \end{macrocode}
  2979. % index
  2980. %    \begin{macrocode}
  2981. vardef vlookup suffix v =
  2982.   if vexists v: vhash.v else: 0 fi
  2983. enddef;
  2984. %    \end{macrocode}
  2985. % and location
  2986. %    \begin{macrocode}
  2987. vardef vloc suffix v =
  2988.   vlist[vlookup v]loc
  2989. enddef;
  2990. %    \end{macrocode}
  2991. % of vertices.  We use |vhash.v| instead of |v| so that we can clear
  2992. % the whole hash table with |save vhash|.
  2993. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2994. % \subsubsection{Constructing the Graph}
  2995. % Connect the vertices in the list |vl| with lines of style |style|,
  2996. % allocating them if necessary.
  2997. % \begin{dubious}
  2998. %   Be more flexible about whether adding arrows
  2999. %   or not.  This should be implemented using the options and devising
  3000. %   a path filter mechanism.
  3001. % \end{dubious}
  3002. %    \begin{macrocode}
  3003. vardef vconnect (expr linesty) (text vl) =
  3004.   save from, nfrom, nto, nopt, sty;
  3005.   numeric from, nfrom, nto, nopt;
  3006.   string sty;
  3007.   getopt (opt, linesty);
  3008.   sty := opt[opt.first];
  3009.   if known opt[opt.first]arg:
  3010.     message "feynmf: line styles don't take arguments.  "
  3011.              & "Argument `" & opt[opt.first]arg & "' ignored.";
  3012.   opt.first := opt.first + 1;
  3013.   forsuffixes to = vl:
  3014.     venter to;
  3015.     nto := vlookup to;
  3016.     if known nfrom:
  3017. %    \end{macrocode}
  3018. % Later, on page~\pageref{pg:vposition}, it will pay back to enter the
  3019. % arc \emph{both} ways: incoming \emph{and}
  3020. % outgoing:\label{pg:vconnect}
  3021. %    \begin{macrocode}
  3022.       vlist[nfrom]arc.last := vlist[nfrom]arc.last + 1;
  3023.       vlist[nto]arc.last := vlist[nto]arc.last + 1;
  3024.       vlist[nfrom]arc[vlist[nfrom]arc.last] := nto;
  3025.       vlist[nto]arc[vlist[nto]arc.last] := nfrom;
  3026.       vlist[nfrom]arc[vlist[nfrom]arc.last]tns := 1;
  3027.       vlist[nto]arc[vlist[nto]arc.last]tns := 1;
  3028.       vlist[nfrom]arc[vlist[nfrom]arc.last]lsr := 0;
  3029.       vlist[nfrom]arc[vlist[nfrom]arc.last]lbl := "";
  3030.       vlist[nfrom]arc[vlist[nfrom]arc.last]lbl.side := "";
  3031.       vlist[nfrom]arc[vlist[nfrom]arc.last]lbl.dist := 3;
  3032. %    \end{macrocode}
  3033. % Handle options, starting with an option |tension|:
  3034. %    \begin{macrocode}
  3035.       for nopt = opt.first upto opt.last:
  3036.         if match_option (opt[nopt], "tension"):
  3037.           get_argument (opt[nopt], scantokens (opt[nopt]arg),
  3038.                         vlist[nfrom]arc[vlist[nfrom]arc.last]tns);
  3039.           get_argument (opt[nopt], scantokens (opt[nopt]arg),
  3040.                         vlist[nto]arc[vlist[nto]arc.last]tns);
  3041. %    \end{macrocode}
  3042. % Handle |left|, |straight| and |right|, which ask for making a
  3043. % halfcircle detour on the specified side or going straight.  If given
  3044. % an optional argument, the halfcircle is pulled in or pushed out,
  3045. % according whether it is smaller or larger than 1.
  3046. % \changes{1.5}{1994/10/20}{Accept optional argument for detours.}
  3047. %    \begin{macrocode}
  3048.         elseif match_option (opt[nopt], "left"):
  3049.           if known opt[nopt]arg:
  3050.             vlist[nfrom]arc[vlist[nfrom]arc.last]lsr
  3051.               := - scantokens (opt[nopt]arg);
  3052.           else:
  3053.             vlist[nfrom]arc[vlist[nfrom]arc.last]lsr := -1;
  3054.           fi
  3055.         elseif match_option (opt[nopt], "straight"):
  3056.           vlist[nfrom]arc[vlist[nfrom]arc.last]lsr := 0;
  3057.           ignore_argument (opt[nopt], opt[nopt]arg);
  3058.         elseif match_option (opt[nopt], "right"):
  3059.           if known opt[nopt]arg:
  3060.             vlist[nfrom]arc[vlist[nfrom]arc.last]lsr
  3061.               := scantokens (opt[nopt]arg);
  3062.           else:
  3063.             vlist[nfrom]arc[vlist[nfrom]arc.last]lsr := 1;
  3064.           fi
  3065. %    \end{macrocode}
  3066. % Labels and which side they're on:
  3067. %    \begin{macrocode}
  3068.         elseif match_option (opt[nopt], "label"):
  3069.           get_argument (opt[nopt], opt[nopt]arg,
  3070.                         vlist[nfrom]arc[vlist[nfrom]arc.last]lbl);
  3071.         elseif match_option (opt[nopt], "label.side"):
  3072.           get_argument (opt[nopt], opt[nopt]arg,
  3073.                         vlist[nfrom]arc[vlist[nfrom]arc.last]lbl.side);
  3074.         elseif match_option (opt[nopt], "label.dist"):
  3075.           get_argument (opt[nopt], scantokens (opt[nopt]arg),
  3076.                         vlist[nfrom]arc[vlist[nfrom]arc.last]lbl.dist);
  3077. %    \end{macrocode}
  3078. % Ignore bogus options:
  3079. %    \begin{macrocode}
  3080.         else:
  3081.           ignore_option (opt[nopt], opt[nopt]arg);
  3082.         fi
  3083.       endfor
  3084. %    \end{macrocode}
  3085. % Avoid entering invalid linestyles into the tables, because the
  3086. % delayed evaluation will make errors harder to find (line numbers
  3087. % will be wrong):
  3088. %    \begin{macrocode}
  3089.       if valid_style sty:
  3090.         vlist[nfrom]arc[vlist[nfrom]arc.last]sty := sty;
  3091.       else:
  3092.         errhelp "feynmf: your linestyle is not recognizable, "
  3093.               & "check spelling and reprocess!";
  3094.         errmessage "feynmf: line style `" & sty & "' not known, "
  3095.                  & "replaced by `vanilla'"; 
  3096.         vlist[nfrom]arc[vlist[nfrom]arc.last]sty := "vanilla";
  3097.       fi
  3098.     fi
  3099. %    \end{macrocode}
  3100. % Restart the loop:
  3101. %    \begin{macrocode}
  3102.     nfrom := nto;
  3103.   endfor
  3104. enddef;
  3105. %    \end{macrocode}
  3106. %    \begin{macrocode}
  3107. vardef get_argument (expr opt, arg) (suffix variable) =
  3108.   if known arg:
  3109.     variable := arg;
  3110.   else:
  3111.     message "feynmf: option `" & opt & "' needs an argument.  Ignored.";
  3112. enddef;
  3113. %    \end{macrocode}
  3114. %    \begin{macrocode}
  3115. vardef ignore_argument (expr opt, arg) =
  3116.   if known arg:
  3117.     message "feynmf: option `" & opt & "' doesn't take an argument.  "
  3118.           & "Argument `" & arg & "' ignored.";
  3119. enddef;
  3120. %    \end{macrocode}
  3121. %    \begin{macrocode}
  3122. vardef ignore_option (expr opt, arg)=
  3123.   if known arg:
  3124.     message "feynmf: ignoring option " & opt & "=" & arg & ".";
  3125.   else:
  3126.     message "feynmf: ignoring option " & opt & ".";
  3127. enddef;
  3128. %</base>
  3129. %    \end{macrocode}
  3130. % \begin{macro}{\fmf}
  3131. % Since |vconnect| wil be the most frequent macro, we give it the
  3132. % shortest \TeX{} command sequence:
  3133. %    \begin{macrocode}
  3134. %<style>\def\fmf#1#2{\fmfcmd{vconnect ("#1", #2);}}
  3135. %    \end{macrocode}
  3136. % \end{macro}
  3137. %    \begin{macrocode}
  3138. %<*base>
  3139. vardef vcyclen (expr sty) (suffix v) (expr n) =
  3140.   for $ = 1 upto n - 1:
  3141.     vconnect (sty, v[$], v[$+1]);
  3142.   endfor
  3143.   vconnect (sty, v[n], v[1]);
  3144. enddef;
  3145. %    \end{macrocode}
  3146. % And the reverse:
  3147. %    \begin{macrocode}
  3148. vardef vrcyclen (expr sty) (suffix v) (expr n) =
  3149.   vconnect (sty, v[1], v[n]);
  3150.   for $ = n downto 2:
  3151.     vconnect (sty, v[$], v[$-1]);
  3152.   endfor
  3153. enddef;
  3154. %</base>
  3155. %    \end{macrocode}
  3156. % \begin{macro}{\fmfcyclen}
  3157. %    \begin{macrocode}
  3158. %<style>\def\fmfcyclen#1#2#3{\fmfcmd{vcyclen ("#1", #2, #3);}}
  3159. %<style>\def\fmfrcyclen#1#2#3{\fmfcmd{vrcyclen ("#1", #2, #3);}}
  3160. %    \end{macrocode}
  3161. % \end{macro}
  3162. % \begin{macro}{\fmfforce}
  3163. %   \begin{macro}{\fmfshift}
  3164. % Explicit placement and shifting of vertices is handled in \TeX{} with
  3165. %    \begin{macrocode}
  3166. %<style>\def\fmfforce#1#2{\fmfcmd{vforce ((#1),#2);}}
  3167. %<style>\def\fmfshift#1#2{\fmfcmd{vshift((#1),#2);}}
  3168. %    \end{macrocode}
  3169. %   \end{macro}
  3170. % \end{macro}
  3171. % Force the vertex |v| to be placed at position |z|:
  3172. %    \begin{macrocode}
  3173. %<*base>
  3174. vardef vforce (expr z) (suffix v) =
  3175.   venter v;
  3176.   vlist[vlookup v]loc := z;
  3177. enddef;
  3178. %    \end{macrocode}
  3179. % Shift the vertex |v| by |z|:
  3180. %    \begin{macrocode}
  3181. vardef vshift (expr z) (text vl) =
  3182.   forsuffixes $=vl:
  3183.     if vexists $:
  3184.       vlist[vlookup $]loc := vlist[vlookup $]loc + z;
  3185.     fi
  3186.   endfor
  3187. enddef;
  3188. %</base>
  3189. %    \end{macrocode}
  3190. % \begin{macro}{\fmffixed}
  3191. % \changes{1.9}{1995/01/07}{New command: \texttt{fmffixed}.}
  3192. % Place the first two arguments in the distance given by the third
  3193. % argument.
  3194. %    \begin{macrocode}
  3195. %<style>\def\fmffixed#1#2{\fmfcmd{vconstraint ((#1), #2);}}
  3196. %    \end{macrocode}
  3197. % \end{macro}
  3198. % This amounts to adding one or more constraints into the vertex data
  3199. % structure:
  3200. %    \begin{macrocode}
  3201. %<*base>
  3202. vardef vconstraint (expr z) (text vl) =
  3203.   save nfrom, nto;
  3204.   numeric nfrom, nto;
  3205.   forsuffixes to = vl:
  3206.     venter to;
  3207.     nto := vlookup to;
  3208.     if known nfrom:
  3209.       vlist[nfrom]constr.last := vlist[nfrom]constr.last + 1;
  3210.       vlist[nto]constr.last := vlist[nto]constr.last + 1;
  3211.       vlist[nfrom]constr[vlist[nfrom]constr.last] := nto;
  3212.       vlist[nto]constr[vlist[nto]constr.last] := nfrom;
  3213.       vlist[nto]loc = vlist[nfrom]loc + z;
  3214.     fi
  3215.     nfrom := nto;
  3216.   endfor
  3217. enddef;
  3218. %</base>
  3219. %    \end{macrocode}
  3220. % \begin{macro}{\fmflabel}
  3221. %    \begin{macrocode}
  3222. %<style>\def\fmflabel#1#2{\fmfcmd{vlabel ("#1", #2);}}
  3223. %    \end{macrocode}
  3224. % \end{macro}
  3225. %    \begin{macrocode}
  3226. %<*base>
  3227. vardef vlabel (expr s) (suffix v) =
  3228.   venter v;
  3229.   vlist[vlookup v]lbl := s;
  3230. enddef;
  3231. %</base>
  3232. %    \end{macrocode}
  3233. % \begin{macro}{\fmfv}
  3234. %    \begin{macrocode}
  3235. %<style>\def\fmfv#1#2{\fmfcmd{vvertex ("#1", #2);}}
  3236. %<style>\def\fmfvn#1#2#3{\fmfcmd{vvertexn ("#1", #2, #3);}}
  3237. %    \end{macrocode}
  3238. % \end{macro}
  3239. % \changes{1.7}{1994/10/22}{%
  3240. %  \texttt{blob} and \texttt{dot} options obsolete, handle generalized
  3241. %  decorations (polygons).}
  3242. %    \begin{macrocode}
  3243. %<*base>
  3244. vardef vvertex (expr vtxsty) (text vl) =
  3245.   save nopt, sty, arg;
  3246.   numeric nopt, arg;
  3247.   string sty;
  3248.   getopt (opt, vtxsty);
  3249.   forsuffixes v = vl:
  3250.     venter v;
  3251.     n := vlookup v;
  3252.     for nopt = opt.first upto opt.last:
  3253.       if match_option (opt[nopt], "label"):
  3254.         get_argument (opt[nopt], opt[nopt]arg, vlist[n]lbl);
  3255.       elseif match_option (opt[nopt], "label.angle"):
  3256.         get_argument (opt[nopt], scantokens (opt[nopt]arg),
  3257.                       vlist[n]lbl.ang);
  3258.       elseif match_option (opt[nopt], "label.dist"):
  3259.         get_argument (opt[nopt], scantokens (opt[nopt]arg),
  3260.                       vlist[n]lbl.dist);
  3261.       elseif match_option (opt[nopt], "decoration.shape"):
  3262.         if known opt[nopt]arg:
  3263. %    \end{macrocode}
  3264. % Maybe we should replace the following long switch by a hashing
  3265. % scheme.
  3266. %    \begin{macrocode}
  3267.           if match_prefix (opt[nopt]arg, "circle"):
  3268.             vlist[n]decor.shape := fullcircle;
  3269.           elseif match_prefix (opt[nopt]arg, "square"):
  3270.             vlist[n]decor.shape := unitsquare shifted -(.5,.5);
  3271.           elseif match_prefix (opt[nopt]arg, "triangle"):
  3272.             vlist[n]decor.shape := polygon 3;
  3273.           elseif match_prefix (opt[nopt]arg, "triagon"):
  3274.             vlist[n]decor.shape := polygon 3;
  3275.           elseif match_prefix (opt[nopt]arg, "diamond"):
  3276.             vlist[n]decor.shape := polygon 4;
  3277.           elseif match_prefix (opt[nopt]arg, "tetragon"):
  3278.             vlist[n]decor.shape := polygon 4;
  3279.           elseif match_prefix (opt[nopt]arg, "pentagon"):
  3280.             vlist[n]decor.shape := polygon 5;
  3281.           elseif match_prefix (opt[nopt]arg, "hexagon"):
  3282.             vlist[n]decor.shape := polygon 6;
  3283.           elseif match_prefix (opt[nopt]arg, "triagram"):
  3284.             vlist[n]decor.shape := polygram 3;
  3285.           elseif match_prefix (opt[nopt]arg, "tetragram"):
  3286.             vlist[n]decor.shape := polygram 4;
  3287.           elseif match_prefix (opt[nopt]arg, "pentagram"):
  3288.             vlist[n]decor.shape := polygram 5;
  3289.           elseif match_prefix (opt[nopt]arg, "hexagram"):
  3290.             vlist[n]decor.shape := polygram 6;
  3291.           else:
  3292.             if feynmfwizard:
  3293.               vlist[n]decor.shape := scantokens(opt[nopt]arg);
  3294.             else:
  3295.               message "feynmf: invalid argument `" & opt[nopt]arg
  3296.                     & "' to option `decor.shape'.  Ignored.";
  3297.             fi
  3298.           fi
  3299.         else:
  3300.           message "feynmf: option `decor.shape' needs an argument.  Ignored.";
  3301.         fi
  3302. %    \end{macrocode}
  3303. % \MP{} has |filled| reserved, use |sty| instead.
  3304. %    \begin{macrocode}
  3305.       elseif match_option (opt[nopt], "decoration.filled"):
  3306.         get_argument (opt[nopt], scantokens (opt[nopt]arg),
  3307.                       vlist[n]decor.sty);
  3308.       elseif match_option (opt[nopt], "decoration.size"):
  3309.         get_argument (opt[nopt], scantokens (opt[nopt]arg),
  3310.                       vlist[n]decor.size);
  3311.       elseif match_option (opt[nopt], "decoration.angle"):
  3312.         get_argument (opt[nopt], scantokens (opt[nopt]arg),
  3313.                       vlist[n]decor.ang);
  3314. %    \end{macrocode}
  3315. % Ignore bogus options:
  3316. %    \begin{macrocode}
  3317.       else:
  3318.         ignore_option (opt[nopt], opt[nopt]arg);
  3319.       fi
  3320.     endfor
  3321.   endfor
  3322. enddef;
  3323. %    \end{macrocode}
  3324. %    \begin{macrocode}
  3325. vardef vvertexn (expr vtxsty) (suffix v) (expr n) =
  3326.   vvertex (vtxsty, vmklist (v, n));
  3327. enddef;
  3328. %</base>
  3329. %    \end{macrocode}
  3330. % \begin{macro}{\fmfblob}
  3331. %   \begin{macro}{\fmfdot}
  3332. % We can decorate vertices with ``blobs'' and dots from \TeX{} with
  3333. % the command sequences:
  3334. %    \begin{macrocode}
  3335. %<style>\def\fmfblob#1#2{\fmfcmd{vblob ((#1),#2);}}
  3336. %<style>\def\fmfdot#1{\fmfcmd{vdot (#1);}}
  3337. %    \end{macrocode}
  3338. %   \end{macro}
  3339. % \end{macro}
  3340. % The vertices in the list |vl| will be drawn with a blob of diameter
  3341. % |bd|:
  3342. %    \begin{macrocode}
  3343. %<*base>
  3344. vardef vblob (expr bd) (text vl)=
  3345.   forsuffixes $=vl:
  3346.     if not vexists $: venter $; fi
  3347.     vlist[vlookup $]decor.shape := fullcircle;
  3348.     vlist[vlookup $]decor.size := bd;
  3349.     vlist[vlookup $]decor.sty := .5;
  3350.  endfor
  3351. enddef;
  3352. %    \end{macrocode}
  3353. % The vertices in the list |vl| will be drawn with a dot.
  3354. %    \begin{macrocode}
  3355. vardef vdot (text vl)=
  3356.   forsuffixes $=vl:
  3357.     if not vexists $: venter $; fi
  3358.     vlist[vlookup $]decor.shape := fullcircle;
  3359.     vlist[vlookup $]decor.size := dot_size;
  3360.     vlist[vlookup $]decor.sty := 1;
  3361.  endfor
  3362. enddef;
  3363. %    \end{macrocode}
  3364. %    \begin{macrocode}
  3365. vardef vdotn (suffix v) (expr n) =
  3366.   vdot (vmklist (v, n));
  3367. enddef;
  3368. %    \end{macrocode}
  3369. %    \begin{macrocode}
  3370. vardef vblobn (suffix v) (expr n) =
  3371.   vblob (vmklist (v, n));
  3372. enddef;
  3373. %</base>
  3374. %    \end{macrocode}
  3375. % \begin{macro}{\fmfdotn}
  3376. % Place |#2| blobs or dots at $|v|_1,\ldots,|v|_{|#1|}$.
  3377. %    \begin{macrocode}
  3378. %<style>\def\fmfblobn#1#2{\fmfcmd{vblobn (#1, #2);}}
  3379. %<style>\def\fmfdotn#1#2{\fmfcmd{vdotn (#1, #2);}}
  3380. %    \end{macrocode}
  3381. % \end{macro}
  3382. % \begin{macro}{\fmfleft}
  3383. %   \begin{macro}{\fmfright}
  3384. %     \begin{macro}{\fmfbottom}
  3385. %       \begin{macro}{\fmftop}
  3386. %         \begin{macro}{\fmfsurround}
  3387. % External vertices are positioned thusly in \TeX{}:
  3388. % \changes{1.9}{1994/10/27}{%
  3389. %   Make \texttt{fmfincoming} and \texttt{fmfoutgoing} obsolescent.
  3390. %   Provide \texttt{fmfleft}, \texttt{fmfright}, \texttt{fmfbottom}
  3391. %   and \texttt{fmftop} instead.}
  3392. % \changes{1.9}{1994/12/29}{Fix typos in \texttt{fmfbottom}
  3393. %   and \texttt{fmftop}.}
  3394. %    \begin{macrocode}
  3395. %<*style>
  3396. \def\fmfleft#1{\fmfcmd{vleft(#1);}}
  3397. \def\fmfright#1{\fmfcmd{vright(#1);}}
  3398. \def\fmfbottom#1{\fmfcmd{vbottom(#1);}}
  3399. \def\fmftop#1{\fmfcmd{vtop(#1);}}
  3400. \let\fmfincoming\fmfleft
  3401. \let\fmfoutgoing\fmfright
  3402. \def\fmfsurround#1{\fmfcmd{vsurround(#1);}}
  3403. %</style>
  3404. %    \end{macrocode}
  3405. %         \end{macro}
  3406. %       \end{macro}
  3407. %     \end{macro}
  3408. %   \end{macro}
  3409. % \end{macro}
  3410. % Here are the ``galleries'' we're hooking our external vertices on
  3411. % (see also the pictures on page~\pageref{p:galleries}):
  3412. %    \begin{macrocode}
  3413. %<*base>
  3414. vardef left_gallery = (.1w,0)..(0,.5h)..(.1w,h) enddef;
  3415. vardef right_gallery = (.9w,0)..(w,.5h)..(.9w,h) enddef;
  3416. vardef bottom_gallery = (0,.1h)..(.5w,0)..(w,.1h) enddef;
  3417. vardef top_gallery = (0,.9h)..(.5w,h)..(w,.9h) enddef;
  3418. vardef surround_gallery =
  3419.   superellipse ((w,.5h), (.5w,h), (0,.5h), (.5w,0), .75)
  3420. enddef;
  3421. %    \end{macrocode}
  3422. % and the \MF{} code which does the hard work for the above
  3423. % \TeX{} macros
  3424. %    \begin{macrocode}
  3425. vardef vleft (text vl) = vdistribute (left_gallery, vl) enddef;
  3426. vardef vright (text vl) = vdistribute (right_gallery, vl) enddef;
  3427. vardef vbottom (text vl) = vdistribute (bottom_gallery, vl) enddef;
  3428. vardef vtop (text vl) = vdistribute (top_gallery, vl) enddef;
  3429. vardef vsurround (text vl) = vdistribute (surround_gallery, vl) enddef;
  3430. %    \end{macrocode}
  3431. % Distribute the vertices in the list |vl| evenly along the path |p|:
  3432. %    \begin{macrocode}
  3433. vardef vdistribute (expr p) (text vl) =
  3434.   save numv, len, off;
  3435.   numeric numv, len, off;
  3436.   numv = count (vl);
  3437. %    \end{macrocode}
  3438. % If the path is cyclic, place the first vertex twice:
  3439. %    \begin{macrocode}
  3440.   if cycle p: numv := numv + 1; fi
  3441.   len := length (p);
  3442.   if numv = 1:
  3443.     vforce (point len/2 of p, vl);
  3444.   else:
  3445.     off := 0;
  3446.     forsuffixes $ = vl:
  3447.       vforce (point off of p, $);
  3448.       off := off + len/(numv-1);
  3449.     endfor
  3450. enddef;
  3451. %</base>
  3452. %    \end{macrocode}
  3453. % \begin{macro}{\fmfleftn}
  3454. %   \begin{macro}{\fmfrightn}
  3455. %     \begin{macro}{\fmfbottomn}
  3456. %       \begin{macro}{\fmftopn}
  3457. %         \begin{macro}{\fmfsurroundn}
  3458. % A short cut:
  3459. %    \begin{macrocode}
  3460. %<*style>
  3461. \def\fmfleftn#1#2{\fmfcmd{vleftn(#1,#2);}}
  3462. \def\fmfrightn#1#2{\fmfcmd{vrightn(#1,#2);}}
  3463. \def\fmfbottomn#1#2{\fmfcmd{vbottomn(#1,#2);}}
  3464. \def\fmftopn#1#2{\fmfcmd{vtopn(#1,#2);}}
  3465. \let\fmfincomingn\fmfleftn
  3466. \let\fmfoutgoingn\fmfrightn
  3467. \def\fmfsurroundn#1#2{\fmfcmd{vsurroundn(#1,#2);}}
  3468. %</style>
  3469. %    \end{macrocode}
  3470. %         \end{macro}
  3471. %       \end{macro}
  3472. %     \end{macro}
  3473. %   \end{macro}
  3474. % \end{macro}
  3475. %    \begin{macrocode}
  3476. %<*base>
  3477. def vmklist (suffix v) (expr n) =
  3478.   for $ = 1 upto n-1: v[$], endfor v[n]
  3479. enddef;
  3480. %    \end{macrocode}
  3481. %    \begin{macrocode}
  3482. vardef vleftn (suffix v) (expr n) =
  3483.   vleft (vmklist (v, n));
  3484. enddef;
  3485. vardef vrightn (suffix v) (expr n) =
  3486.   vright (vmklist (v, n));
  3487. enddef;
  3488. vardef vbottomn (suffix v) (expr n) =
  3489.   vbottom (vmklist (v, n));
  3490. enddef;
  3491. vardef vtopn (suffix v) (expr n) =
  3492.   vtop (vmklist (v, n));
  3493. enddef;
  3494. vardef vsurroundn (suffix v) (expr n) =
  3495.   vsurround (vmklist (v, n));
  3496. enddef;
  3497. %</base>
  3498. %    \end{macrocode}
  3499. % \begin{macro}{\fmffor}
  3500. %   \begin{macro}{\endfmffor}
  3501. %    \begin{macrocode}
  3502. %<*style>
  3503. \def\fmffor#1#2#3#4{\fmfcmd{for #1 = #2 step #3 until #4:}}
  3504. \def\endfmffor{\fmfcmd{endfor}}
  3505. %</style>
  3506. %    \end{macrocode}
  3507. %   \end{macro}
  3508. % \end{macro}
  3509. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3510. % \subsubsection{Choosing a Layout for the Graph}
  3511. % The procedure |vposition| is called near the end and
  3512. % chooses ``optimal'' vertex positions by minimizing the sum of the
  3513. % weighted lengths of the arcs.  Since the quantity to be optimized is
  3514. % quadratic in the vertices
  3515. % \begin{equation}
  3516. %   L = \frac{1}{2} \sum_i \sum_{j\in\alpha(i)}
  3517. %         t_{ij} (\vec v_i - \vec v_j)^2\,,
  3518. % \end{equation}
  3519. % where~$\alpha(i)$ denotes the set of vertices connectes with the
  3520. % vertex~$i$, we just have to solve a system of linear equations.
  3521. % Adding Lagrange multipliers~$\lambda_{ij}$ for the constraints that
  3522. % have been specified
  3523. % \begin{equation}
  3524. %   \Lambda = \sum_i \sum_{j\in\gamma(i) \atop j>i}
  3525. %         \vec\lambda_{ij}\cdot(\vec v_i - \vec v_j - \vec d_{ij})\,,
  3526. % \end{equation}
  3527. % where~$\gamma(i)$ denotes the set of vertices which have a fixed
  3528. % distance to the vertex~$i$, the set of linear equations is given by
  3529. % \begin{eqnarray}
  3530. %   0 & = & \frac{\partial}{\partial \vec v_i} (L+\Lambda)
  3531. %            = \sum_{j\in\alpha(i)} t_{ij} (\vec v_i - \vec v_j)
  3532. %              + \sum_{j\in\gamma(i) \atop j>i} \vec\lambda_{ij}
  3533. %              - \sum_{j\in\gamma(i) \atop j<i} \vec\lambda_{ji} \\
  3534. %   0 & = & \vec v_i - \vec v_j - \vec d_{ij}\;\; \mid  j \in \gamma(i)\,.
  3535. % \end{eqnarray}
  3536. % The implementation is simple: loop over all vertices in |vlist[]|
  3537. %    \begin{macrocode}
  3538. %<*base>
  3539. vardef vposition =
  3540.   for i = vertices:
  3541. %    \end{macrocode}
  3542. % and iff the position of the vertex has not been fixed yet, add
  3543. % another equation.  Note that each arc enters twice (incoming
  3544. % \emph{and} outgoing) in this procedure.  Thus it is easiest to store
  3545. % them \emph{both} ways in the |vlist| structure
  3546. % (cf.~page~\pageref{pg:vconnect})\label{pg:vposition}.
  3547. %    \begin{macrocode}
  3548.     if unknown vlist[i]loc:
  3549.       origin = origin
  3550.       for j = varcs (i):
  3551.         + vlist[i]arc[j]tns * (vlist[i]loc - vlist[vlist[i]arc[j]]loc)
  3552.       endfor
  3553.       for j = vconstr (i):
  3554.         if i < vlist[i]constr[j]:
  3555.           + lambda[i][vlist[i]constr[j]]
  3556.         else:
  3557.           - lambda[vlist[i]constr[j]][i]
  3558.         fi
  3559.       endfor;
  3560.     fi
  3561.   endfor
  3562. %    \end{macrocode}
  3563. % Inquiring minds might want to see the result in numbers:
  3564. %    \begin{macrocode}
  3565.   if vtracing: vdump; fi
  3566. enddef;
  3567. %</base>
  3568. %    \end{macrocode}
  3569. % \begin{macro}{\fmfposition}
  3570. % Again, we can ask for positioning and drawing explicitely from \TeX
  3571. % (usually called implicitely by |\end{fmfchar}|).  This is useful for
  3572. % subsequent fine tuning.
  3573. %    \begin{macrocode}
  3574. %<style>\def\fmfposition{\fmfcmd{vposition;}}
  3575. %    \end{macrocode}
  3576. % \end{macro}
  3577. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3578. % \subsubsection{Drawing the Graph}
  3579. % \begin{macro}{\fmfdraw}
  3580. %    \begin{macrocode}
  3581. %<style>\def\fmfdraw{\fmfcmd{vdraw;}}
  3582. %    \end{macrocode}
  3583. % \end{macro}
  3584. % And here's the actual \MF{} implementation of |vdraw|:
  3585. %    \begin{macrocode}
  3586. %<*base>
  3587. vardef vdraw =
  3588. %    \end{macrocode}
  3589. % Check that all vertices are known before attempting to draw the
  3590. % diagram.
  3591. %    \begin{macrocode}
  3592.   for i = vertices:
  3593.     if not known vlist[i]loc:
  3594.       errhelp "Your graph specification was not complete (probably a "
  3595.             & "lone vertex).            Check logic and reprocess!";
  3596.       errmessage "feynmf: vertex `" & vlist[i]name & "' not determined, "
  3597.                & "replaced by `(0,0)'."; 
  3598.       vlist[i]loc := origin;
  3599.     fi
  3600.     if unknown vlist[i]decor.size:
  3601.       vlist[i]decor.size = decor_size;
  3602.     fi
  3603.   endfor
  3604. %    \end{macrocode}
  3605. % Now do the actual drawing, looping over vertices and arcs.
  3606. %    \begin{macrocode}
  3607.   for i = vertices:
  3608.     for j = varcs (i):
  3609.       if known vlist[i]arc[j]sty:
  3610. %    \end{macrocode}
  3611. % \changes{1.5}{1994/10/20}{Implement optional argument for detours.}
  3612. %    \begin{macrocode}
  3613.         vdraw_arc (vlist[i]arc[j]sty,
  3614.                    cut_decors (vlist[i],
  3615.                                vbuild_arc (vlist[i]arc[j]lsr,
  3616.                                            vlist[i]loc,
  3617.                                            vlist[vlist[i]arc[j]]loc),
  3618.                                vlist[vlist[i]arc[j]]),
  3619.                    vlist[i]arc[j]lbl);
  3620.       fi
  3621.     endfor;
  3622.     vdraw_vertex_label vlist[i];
  3623.     vdraw_vertex vlist[i];
  3624.   endfor
  3625. enddef;
  3626. %    \end{macrocode}
  3627. % Construct an arc from |from| to |to|.  The arc will be straight if
  3628. % $|lsr| = 0$, a left (approximate) halfcircle if $|lsr| = -1$ and a
  3629. % right halfcircle if $|lsr| = 1$.  Othe values of |lsr| will give
  3630. % obvious interpolations.  We optimize the most frequent straight
  3631. % line case. 
  3632. % \changes{1.6}{1994/10/22}{%
  3633. %   Don't use \texttt{interpath} and halfcircles for detours anymore.
  3634. %   Simple paths constructed from three points are better (and
  3635. %   simpler).}
  3636. %    \begin{macrocode}
  3637. vardef vbuild_arc (expr lsr, from, to) =
  3638.   if lsr = 0:
  3639.     from -- to
  3640.   else:
  3641.     from
  3642.       .. (1-lsr)/2 *(to rotatedabout (.5[from,to], 90))
  3643.          + (1+lsr)/2 * (to rotatedabout (.5[from,to], -90))
  3644.       .. to
  3645. enddef;
  3646. %    \end{macrocode}
  3647. %    \begin{macrocode}
  3648. vardef vdraw_arc (expr sty, arc) (suffix lbl) =
  3649.   scantokens ("draw_" & sty) (arc);
  3650.   vdraw_arc_label (arc, lbl);
  3651. enddef;
  3652. %    \end{macrocode}
  3653. %    \begin{macrocode}
  3654. vardef vdraw_arc_label (expr arc) (suffix lbl) =
  3655.   if lbl <> "":
  3656.     save _a, _z, _zz, _r;
  3657.     numeric _a;
  3658.     pair _z, _zz, _r;
  3659.     _z := point .5 length (arc) of arc;
  3660.     _r := direction .5 length (arc) of arc rotated - 90;
  3661.     if lbl.side = "left":
  3662.       _a := angle (-_r);
  3663.     elseif lbl.side = "right":
  3664.       _a := angle (_r);
  3665.     else:
  3666. %    \end{macrocode}
  3667. % Normalize to avoid overflow in |dotprod|:
  3668. % \changes{1.9}{1995/02/18}{%
  3669. %   \texttt{vdraw\_arc\_label}: Protect against divide by zero.}
  3670. %    \begin{macrocode}
  3671.       _zz = _z - .5[point 0 of arc, point infinity of arc];
  3672.       if ((_zz if length (_zz) >  0: / length (_zz) fi)
  3673.           dotprod _r) >= 0:
  3674.         _a := angle (_r);
  3675.       else:
  3676.         _a := angle (-_r);
  3677.       fi
  3678.     fi
  3679.     LaTeX_text (_z + lbl.dist * thick * dir _a, _a, lbl);
  3680. enddef;
  3681. %    \end{macrocode}
  3682. %    \begin{macrocode}
  3683. vardef vdraw_vertex_label suffix v =
  3684.   if v.lbl <> "":
  3685.     save a;
  3686.     numeric a;
  3687.     if unknown v.lbl.ang:
  3688.       if v.loc = (.5w,.5h):
  3689.         a := 0;
  3690.       else:
  3691.         a := angle (v.loc - (.5w,.5h));
  3692.       fi
  3693.     else:
  3694.       a := v.lbl.ang;
  3695.     fi
  3696.     LaTeX_text (v.loc + v.lbl.dist * thick * dir a, a, v.lbl);
  3697. enddef;
  3698. %    \end{macrocode}
  3699. %    \begin{macrocode}
  3700. vardef vdraw_vertex suffix v =
  3701.   save cmd;
  3702.   string cmd;
  3703.   if known v.decor.shape:
  3704.     cmd := "filldraw";
  3705.     if known v.decor.sty:
  3706.       if v.decor.sty = 0:
  3707.         cmd := "draw";
  3708.       elseif abs (v.decor.sty) >= 1:
  3709.         cmd := "filldraw";
  3710.       elseif v.decor.sty > 0:
  3711.         cmd := "shadedraw";
  3712.       else:
  3713.         cmd := "hatchdraw";
  3714.       fi
  3715.     fi
  3716.     scantokens (cmd) v.decor.shape
  3717.       if known v.decor.ang: rotated v.decor.ang fi
  3718.       scaled v.decor.size shifted v.loc;
  3719. enddef;
  3720. %    \end{macrocode}
  3721. %    \begin{macrocode}
  3722. vardef polygon expr n =
  3723.   if n > 2:
  3724.     for i = 1 upto n:
  3725.       (.5up rotated (360i/n)) --
  3726.     endfor
  3727.     cycle
  3728.   else:
  3729.     fullcircle
  3730. enddef;
  3731. %    \end{macrocode}
  3732. %    \begin{macrocode}
  3733. vardef polygram expr n =
  3734.   if n > 2:
  3735.     for i = 1 upto n:
  3736.       (.5up rotated (360i/n)) --
  3737.       (.2up rotated (360(i+.5)/n)) --
  3738.     endfor
  3739.     cycle
  3740.   else:
  3741.     fullcircle
  3742. enddef;
  3743. %    \end{macrocode}
  3744. % Unfortunately, enclosing the |message| in a |batchmode|
  3745. % |errorstopmode| pair doesn't work.  The label information isn't
  3746. % written to the terminal, but an empty line is anyway \ldots
  3747. % \changes{1.4}{1994/05/28}{%
  3748. %   \MP: \texttt{write} the label files directly.}
  3749. %    \begin{macrocode}
  3750. vardef LaTeX expr text =
  3751. %<*!mp>
  3752.   message (":" & jobname & "." & decimal charcode & ":" & text & "%%%")
  3753. %</!mp>
  3754. %<*mp>
  3755.   if LaTeX_file = "":
  3756.     LaTeX_file := jobname & ".t" & decimal charcode;
  3757.     write ("% " & LaTeX_file & " -- generated from " & jobname & ".mp")
  3758.       to LaTeX_file;
  3759.   write (text & "%%%") to LaTeX_file
  3760. %</mp>
  3761. enddef;
  3762. vardef LaTeX_text (expr z, a, txt) =
  3763.   LaTeX "\fmfL(" & (decimal (xpart z/LaTeX_unitlength)) & ","
  3764.       & (decimal (ypart z/LaTeX_unitlength)) & ","
  3765.       & (voctant a) & "){" & txt & "}";
  3766. enddef;
  3767. %</base>
  3768. %    \end{macrocode}
  3769. % \begin{macro}{\fmfL}
  3770. % This is an internal macro for squeezing more text into \MF's
  3771. % 80 character wide output.
  3772. %    \begin{macrocode}
  3773. %<style>\def\fmfL(#1,#2,#3)#4{\put(#1,#2){\makebox(0,0)[#3]{#4}}}
  3774. %    \end{macrocode}
  3775. % \end{macro}
  3776. % This will only be used with $\vert|a|\vert\le180$:
  3777. %    \begin{macrocode}
  3778. %<*base>
  3779. vardef voctant expr a =
  3780.   voctant_list[floor (a/45 + .5)]
  3781. enddef;
  3782. string voctant_list[];
  3783. voctant_list[-4] := "r";
  3784. voctant_list[-3] := "rt";
  3785. voctant_list[-2] := "t";
  3786. voctant_list[-1] := "lt";
  3787. voctant_list[0] := "l";
  3788. voctant_list[1] := "lb";
  3789. voctant_list[2] := "b";
  3790. voctant_list[3] := "rb";
  3791. voctant_list[4] := "r";
  3792. %    \end{macrocode}
  3793. %    \begin{macrocode}
  3794. vardef vdump =
  3795.   message ">>>>> Vertices and arcs for diagram #" & decimal charcode
  3796.         & " of " & jobname & ".mf:";
  3797.   for i = vertices:
  3798.     message "> " & vlist[i]name & "=" & decimal_pair (vlist[i]loc)
  3799.           & ": #lines="
  3800.           & decimal (vlist[i]arc.last - vlist[i]arc.first + 1)
  3801.           if vlist[i]lbl <> "":
  3802.             & ", lbl=" & vlist[i]lbl
  3803.             & ", l.angle=" & decimal_ (vlist[i]lbl.ang)
  3804.             & ", l.dist=" & decimal_ (vlist[i]lbl.dist)
  3805.           fi
  3806.           & ".";
  3807.   endfor
  3808.   for i = vertices:
  3809.     for j = varcs (i):
  3810.       if known vlist[i]arc[j]sty:
  3811.         message "> " & vlist[i]name & "*" & vlist[vlist[i]arc[j]]name
  3812.                 & ": " & vlist[i]arc[j]sty
  3813.                 & ", tns=" & decimal_ (vlist[i]arc[j]tns)
  3814.                 & ", lsr=" & decimal_ (vlist[i]arc[j]lsr)
  3815.                 if vlist[i]arc[j]lbl <> "":
  3816.                   & ", lbl=" & vlist[i]arc[j]lbl
  3817.                   & ", l.side=" & vlist[i]arc[j]lbl.side
  3818.                   & ", l.dist=" & decimal_ (vlist[i]arc[j]lbl.dist)
  3819.                 fi
  3820.                 & ".";
  3821.       fi
  3822.     endfor
  3823.     for j = vconstr (i):
  3824.       if i < vlist[i]constr[j]:
  3825. %    \end{macrocode}
  3826. % We don't keep an explicit record of the fixed distances, but they're
  3827. % easy to recover:
  3828. %    \begin{macrocode}
  3829.         save z;
  3830.         pair z;
  3831.         z = vlist[vlist[i]constr[j]]loc - vlist[i]loc;
  3832.         message "> " & vlist[i]name & "&"
  3833.                 & vlist[vlist[i]constr[j]]name
  3834.                 & ": " & decimal_pair (z);
  3835.       fi
  3836.     endfor;
  3837.   endfor
  3838. enddef;
  3839. %    \end{macrocode}
  3840. %    \begin{macrocode}
  3841. vardef decimal_ (text n) =
  3842.   if known n: decimal n else: "?" fi
  3843. enddef;
  3844. %    \end{macrocode}
  3845. %    \begin{macrocode}
  3846. vardef decimal_pair (text z) =
  3847.   "(" & decimal_ (xpart z) & "," & decimal_ (ypart z) & ")"
  3848. enddef;
  3849. %    \end{macrocode}
  3850. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3851. % \subsubsection{Online displays}
  3852. % This is a bit smarter about pictures of varying sizes and some
  3853. % overshooting than |showit|.  You can still get burned, though,
  3854. % because \MF{} might not be able to enlarge the screen sufficiently.
  3855. % \changes{1.9}{1994/10/25}{Online display support.}
  3856. %    \begin{macrocode}
  3857. def show_diagram_ expr frame =
  3858.   if (screen_cols < w + 2 xpart frame) or (screen_rows < h + 2 ypart frame):
  3859.     screen_cols := w + 2 xpart frame;
  3860.     screen_rows := h + 2 ypart frame;
  3861.     openwindow currentwindow
  3862.       from origin to (screen_rows, screen_cols)
  3863.       at (- xpart frame, h + ypart frame);
  3864.   showit_;
  3865.   if showstopping > 0:
  3866.     stop "This is diagram #" & decimal charcode
  3867.        & ".  Hit return to continue...";
  3868. enddef;
  3869. %    \end{macrocode}
  3870. % Self-modifying code is \emph{fun}: make sure to clear the window the
  3871. % second time around.
  3872. %    \begin{macrocode}
  3873. def show_diagram =
  3874.   def show_diagram =
  3875.     display blankpicture inwindow currentwindow;
  3876.     show_diagram_
  3877.   enddef;
  3878.   show_diagram_
  3879. enddef;
  3880. %    \end{macrocode}
  3881. % |show_all_diagrams| turns on the above online display mechanism.
  3882. % Creative use of |extra_endchar| allows us to do this from the
  3883. % command line (|showstopping| is used here to slow down the slide
  3884. % show).
  3885. % \begin{verbatim}
  3886. % mf '\mode:=localmode;
  3887. %     showstopping:=1;
  3888. %     extra_endchar:="show_all_diagrams(100,100);";
  3889. %     input foo.mf'
  3890. % \end{verbatim}
  3891. %    \begin{macrocode}
  3892. def show_all_diagrams expr frame =
  3893.   def showit = show_diagram frame enddef;
  3894.   displaying:=1;
  3895. enddef;
  3896. %</base>
  3897. %    \end{macrocode}
  3898. % \begin{macro}{\fmfdisplay}
  3899. % Make the display accessible from \TeX{} too.
  3900. %    \begin{macrocode}
  3901. %<*style>
  3902. \def\fmfdisplay{\fmfcmd{show_all_diagrams (100,100);}}
  3903. \def\fmfstopdisplay{\fmfcmd{showstopping:=1;}\fmfdisplay}
  3904. %</style>
  3905. %    \end{macrocode}
  3906. % \end{macro}
  3907. % Now we're done with the \MF{} macros
  3908. %    \begin{macrocode}
  3909. %<*base>
  3910. endinput;
  3911. %</base>
  3912. %    \end{macrocode}
  3913. % and the \TeX{} macros too:
  3914. %    \begin{macrocode}
  3915. %<*style>
  3916. \mdqrestore
  3917. %</style>
  3918. %    \end{macrocode}
  3919. % \Finale
  3920. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3921. % \appendix
  3922. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3923. % \section{Driver file}
  3924. %    \begin{macrocode}
  3925. %<*driver>
  3926. %<*!209>
  3927. \documentclass[a4paper]{article}
  3928. \usepackage{doc}
  3929. %    \end{macrocode}
  3930. % The \MF{} and \MP{} logos come out much nicer if you have |mflogo|
  3931. % installed:
  3932. %    \begin{macrocode}
  3933. \IfFileExists{mflogo.sty}%
  3934.   {\usepackage{mflogo}%
  3935.    \def\FMF{\texttt{feyn}\textlogo{MF}}}%
  3936.   {\def\MF{\textsf{META}\-\textsf{FONT}}%
  3937.    \def\MP{\textsf{META}\-\textsf{POST}}%
  3938.    \def\FMF{\texttt{feyn}\textsf{MF}}}
  3939. %    \end{macrocode}
  3940. % Here is the place to declare your own PostScript aware |dvi| driver
  3941. % option:
  3942. %    \begin{macrocode}
  3943. %<mp>\usepackage[dvips]{feynmp}
  3944. %<!mp>\usepackage{feynmf}
  3945. %</!209>
  3946. %<*209>
  3947. %<mp>\documentstyle[doc,feynmp209]{article}
  3948. %<!mp>\documentstyle[doc,feynmf209]{article}
  3949. \def\textit#1{{\it#1\/}}
  3950. \def\textbf#1{{\bf#1}}
  3951. \def\textsf#1{{\sf#1}}
  3952. \def\texttt#1{{\tt#1}}
  3953. \def\emph#1{{\em#1\/}}
  3954. \let\bfseries\bf
  3955. \def\LaTeXe{\LaTeX$2_\epsilon$}
  3956. \def\MF{\textsf{META}\-\textsf{FONT}}
  3957. \def\MP{\textsf{META}\-\textsf{POST}}
  3958. \def\FMF{\texttt{feyn}\textsf{MF}}
  3959. %</209>
  3960. \font\manfnt=manfnt
  3961. \def\dangerousbend/{{\manfnt\char"7F}}
  3962. \def\dubious{\begin{itemize}\item[\dangerousbend/]}
  3963. \def\enddubious{\end{itemize}}
  3964. \parindent0pt
  3965. %<manual>\OnlyDescription
  3966. \EnableCrossrefs
  3967. \RecordChanges
  3968. \CodelineIndex
  3969. \DoNotIndex{\def,\gdef,\long,\let,\begin,\end,\if,\ifx,\else,\fi}
  3970. \DoNotIndex{\immediate,\write,\newwrite,\openout,\closeout,\typeout}
  3971. \DoNotIndex{\font,\nullfont,\jobname,\documentclass}
  3972. \DoNotIndex{\batchmode,\errorstopmode,\char,\catcode,\ }
  3973. \DoNotIndex{\CodelineIndex,\docdate,\DocInput,\DoNotIndex,\EnableCrossrefs}
  3974. \DoNotIndex{\filedate,\filename,\fileversion,\logo,\manfnt}
  3975. \DoNotIndex{\NeedsTeXFormat,\ProvidesPackage,\RecordChanges,\space}
  3976. \DoNotIndex{\usepackage,\wlog,\@gobble,\@ifundefined,\@namedef,\@spaces}
  3977. \DoNotIndex{\begingroup,\csname,\edef,\endcsname,\expandafter,\hbox}
  3978. \DoNotIndex{\hskip,\ifeof,\ignorespaces,\item,\leavevmode,\loop,\makebox}
  3979. \DoNotIndex{\newcounter,\newif,\newread,\openin,\par,\parindent,\put}
  3980. \DoNotIndex{\read,\relax,\repeat,\setcounter,\stepcounter,\the}
  3981. \DoNotIndex{\value,\vbox,\vskip}
  3982. \DoNotIndex{}
  3983. %    \end{macrocode}
  3984. % Cut the linebreaking some slack for macrocode which might conatin
  3985. % long lines (it doesn't really hurt if they stick out a bit).
  3986. %    \begin{macrocode}
  3987. \let\origmacrocode\macrocode
  3988. \def\macrocode{\hfuzz 5em\origmacrocode}
  3989. \begin{document}
  3990.   \DocInput{feynmf.dtx}
  3991. \end{document}
  3992. %</driver>
  3993. %    \end{macrocode}
  3994. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3995. \endinput
  3996. Local Variables:
  3997. mode:LaTeX
  3998. fill-prefix:"% "
  3999. indent-tabs-mode:nil
  4000. change-log-default-name:"TODO"
  4001. page-delimiter:"^% %%%%%%%%%*\n"
  4002.